首页 文章

Python 3.4无法识别包

提问于
浏览
4

在我的树莓派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 回答

  • 1

    enum34 的特定情况下,如果您尝试运行Python 3.4,则不需要它 . 那个特定的包是Python 3.4的早期版本的Python的后端版本 enum . 你可以在Python 3.4中使用 import enum .

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

    当您运行 pip install enum34 时, pip --version 报告的Python版本将获取该程序包 . 如果 python --versionwhich python 不同,那么您将无法导入包,因为它是's not installed in that version' s存储库 .

    如果您需要使用已安装的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,其中包含某种外部安装程序3.4版,该安装程序安装在 /usr/local 下 .

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

    那么,'s going wrong here is probably that you'正在运行 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/ 中,但是's because I' m在macOS上,我在操作系统控制之外安装Python 3 . 在Debian上,几乎总是应该通过 apt 安装Python,它安装在 /usr/ 中 .

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

    你可以通过设置一个虚拟环境来忽略这个问题,你可能应该这样做,但是起初它有点繁琐,我不能推荐 virtualenv 的任何新手指南 .

  • 4

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

    • 检查python是否扫描 /usr/local/lib/python3.4/dist-packages for libs . 您可以通过打印 import sys;print (sys.path) 来检查这一点,它为您提供了python扫描库的路径列表 . 如果路径不存在则添加路径 .

    • 默认情况下检查正在使用哪个版本的python python2.7python3 默认 pythonpython2.7 . 另外,python 3 refer this无法访问Python 2.7库以更改默认的python版本 .

    • 默认 pippython2 安装库,因此使用 pip3 安装 python3 的包 . 检查 pip 在您的案例中安装了库的位置,并检查是否可以使用第1点访问这些路径 .

    • 有时,当shell脚本调用脚本时,有可能以不同的用户(例如普通用户,root用户)执行这些脚本,在这种情况下,所有这些环境配置如shell,路径更改 . 在这种情况下检查所有上述要点 .

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

  • 1

    有点儿严重破坏了Python查找文件的地方 .

    有两个版本的Python - 遗留Python 2和当前的Python 3.默认情况下, python executable( /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

    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 .

相关问题