繁体   English   中英

Python 3.4无法识别包

[英]Python 3.4 not recognising package

在我的覆盆子pi 3模型BI上运行linux raspberrypi 4.4.48-v7这是一个debian发行版/风味。

我安装了python 3.4。

sudo pip install enum34

回报 -

Requirement already satisfied: enum34 in /usr/local/lib/python3.4/dist-packages.

我正在尝试安装和运行这个微博蓝牙交互的开源项目(但我相信我的问题与python配置有关) -

https://github.com/VRGhost/PyPush

我已经安装了包和要求,但当我尝试加载/提供包时,如下 -

./bin/serve.sh --ble_driver bluegiga --ble_device /dev/tty.usbmodem1 web_ui

我收到-

/usr/bin/python: No module named enum; 'PyPush' is a package and cannot be directly executed

我相信在失败的serve.sh中的行是 -

exec python -m PyPush $*

如何让python将PyPush识别为模块? 我在网上找到的东西是指安装的enum34。

enum34的特定情况下,如果您尝试运行Python 3.4,则不需要它。 这个特定的包的Python 3.4的一个补丁包, enum到Python的早期版本。 你可以在Python 3.4+中import enum

您似乎安装了至少三个版本的Python。 有两个是正常的:Python 2.7和Python 3.x. 每个版本都有自己的包存储库,无法看到其他版本。 您似乎已安装第三个自定义安装。

当你运行pip install enum34pip --version报告的Python pip --version会获得包。 如果python --versionwhich python不同,那么你将无法导入包,因为它没有安装在该版本的存储库中。

如果您需要使用已安装的自定义Python版本,则可以通过在/usr/local/bin/添加命令来运行它和正确版本的pip。 例如, /usr/local/bin/pip3.4/usr/local/bin/pip3/usr/local/bin/python3.4/usr/local/bin/python

也就是说,我怀疑你需要这个自定义版本的Python。 你应该真正使用你的发行版本,否则,将官方Python存储库添加到apt并以这种方式安装Python。

您的发行版可能是Raspbian ,正如您所说的Debian风格。 Debian附带了Python 3和Python 2.这些安装在/usr下的系统中。 您似乎已经安装了第三个Python,其中包含某种安装在/usr/local下的外部安装程序3.4版。

通常在Linux中,您应该尽可能使用您的发行版的安装程序。 在Debian的情况下,这意味着apt 如果您阅读了一个教程,告诉您通过运行从某些.tar.gz提取的脚本来安装软件,可能不会。 对于Debian,请进行apt search以查看您所需的软件版本是否可用,如果没有,请查看项目(例如,Python,Node,Yarn)是否有将其官方存储库添加到您的发行版的说明。

所以,这里出现的问题可能是你正在运行pip来安装enum34软件包。 这可能是Python 2.7的pip版本。 您可以通过运行pip --version来验证这一点。 我的版本使用Python 3.5,您可以在下面看到:

$ pip --version pip 9.0.1 from /usr/local/lib/python3.5/site-packages (python 3.5) $

您可以看到我的Python 3版本安装在/usr/local/ ,但那是因为我在macOS上,我在操作系统的控制之外安装Python 3。 在Debian上,几乎总是应该通过apt安装Python,它安装在/usr/

现在,当你运行pip install enum34pip --version报告的Python pip --version会获得包。 如果这与python --version报告的python --version ,则在运行该版本的python时将无法看到该包。 您仍然可以在系统和自定义安装中安装相同版本的Python。 当你运行which pipwhich python ,那些也应该在同一个路径中。 如果which pip/usr/local/bin/pip以及which python/usr/bin/python ,你仍会遇到同样的问题。

您可以通过设置虚拟环境来忽略该问题,无论如何您应该这样做,但这有点麻烦。 虚拟环境允许您为每个项目维护一组单独的Python包,从而保护您免受需要同一包的不同版本的两个项目的影响。 因此,它还可以防止您意外使用不同版本的pip和python。 然而,一开始它有点繁琐,我不能推荐任何针对virtualenv新手指南。

似乎无法访问包路径。 请执行下列操作。

  1. 检查python是否扫描libs的/usr/local/lib/python3.4/dist-packages 您可以通过打印import sys;print (sys.path)来检查这一点import sys;print (sys.path)它为您提供了python扫描库的路径列表。 如果路径不存在则添加路径。
  2. 默认情况下检查哪个版本的python正在使用python2.7python3默认情况下python是指python2.7 此外,python 3无法访问Python 2.7库, 请参阅此更改默认的python版本。
  3. 默认情况下, pip会为python2安装库,因此请使用pip3来安装python3包。 检查pip在您的案例中安装库的位置,并检查是否可以使用第1点访问这些路径。
  4. 有些时候,shell脚本调用脚本时,有可能以不同的用户(例如普通用户,root)执行这些脚本,在这种情况下,所有这些环境配置如shell,路径都会发生变化。 在这种情况下检查所有上述要点。

我敢肯定,如果您检查这4点,您的问题将得到解决。 我猜你的问题应该是第1点或第4点。

在Python查找文件的地方,有些东西被严重破坏了。

有两个版本的Python - 遗留Python 2和当前的Python 3.默认情况下, python可执行文件( /usr/bin/python )指向Python 2, pip可执行文件指向Python 2模块。 Python 3分别使用python3pip3

但是,你的pip (用于Python2)发现模块安装在/usr/local/lib/ python3.4 /dist-packages 它不应该从那里开始。

我不知道你是如何在这种情况下结束的,但在虚拟环境的帮助下它是可以挽救的。 只需创建新的虚拟环境,激活它,安装所有依赖项并再次运行命令:

virtualenv --always-copy --python=python2 /path/to/virtualenv/directory
source activate /path/to/virtualenv/directory
pip install -r requirements/prod.txt
./bin/serve.sh --ble_driver bluegiga --ble_device /dev/tty.usbmodem1 web_ui

如果您没有virtualenv命令可用,请安装它

apt install virtualenv

pip用于Python 2.x, pip3用于Python 3.x. 我还快速查看了为PyPush编写的Python版本。 搜索print通常是一种快速的方法。 GitHub使用print ...而不是print(...)返回多个结果,这意味着你有使用Python 2.x而不是Python 3.x编写的源代码。 你将不得不切换到2.x.

输出

Requirement already satisfied: enum34 in /usr/local/lib/python3.4/dist-packages.

告诉你你的enum包是为Python 3.x安装的,但同时你得到了

/usr/bin/python: No module named enum; 'PyPush' is a package and cannot be directly executed

大多数发行版上的/usr/bin/python仍然代表Python 2.x. 您可以使用/usr/bin/python --version检查它是哪个版本(2.x或3.x)以确保。

长篇大论 - 你有Python 3.x的enum包,PyPush是为Python 2.x编写的,你还需要Python 2.x的反向移植enum

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM