Python 3.4无法识别包

时间:2017-04-26 15:26:35

标签: python linux debian

在我的覆盆子pi 3型号B上我运行的是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。

4 个答案:

答案 0 :(得分:4)

enum34的特定情况下,如果您尝试运行Python 3.4,则不需要它。该特定包是 Python 3.4' enum到早期版本的Python的backport 。你可以在Python 3.4 +中使用import enum

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

当您运行pip install enum34时,pip --version报告的Python版本将获得该程序包。如果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中,您应该尽可能使用您的发行版安装程序。对于Debians,这意味着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而不是OS。在Debian上,Python几乎总是通过apt安装,安装到/usr/

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

在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

答案 3 :(得分:1)

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