【问题标题】:Can't start Python - ImportError: No module named posixpath无法启动 Python - ImportError:没有名为 posixpath 的模块
【发布时间】:2014-09-28 18:25:04
【问题描述】:

所以我有一个用 Python 编写的应用程序,它使用带有 Python 2.7.3 的 virtualenv。应用程序使用 rabbitmq 和 celery 运行一些任务。几天来一切都很顺利,今天我注意到任务没有得到处理。我登录到服务器并注意到rabbitmq 已关闭。我启动了rabbitmq服务器,然后尝试启动python解释器,我得到:

Traceback (most recent call last):
  File "/home/marcin/pyProjects/resbit/venv/lib/python2.7/site.py", line 67, in <module>
    import os
  File "/home/marcin/pyProjects/resbit/venv/lib/python2.7/os.py", line 49, in <module>
    import posixpath as path
ImportError: No module named posixpath

这只发生在 virtualenv 中。我可以毫无问题地启动全局 Python。我的服务器(使用 Linode)最近没有重新启动,据我所知,没有安装/更新任何东西。 会发生什么?

【问题讨论】:

    标签: python rabbitmq celery linode


    【解决方案1】:

    您的虚拟环境显然创建不正确或创建后修改。 posixpath 是一个内置模块,它是os.path 模块的动态选择替代方案之一。在类 Unix 系统上使用。它应该是所有 Python 环境的标准部分。

    In [2]: import posixpath
    
    In [3]: import os.path
    
    In [4]: os.path is posixpath
    Out[4]: True
    

    如果您无法导入 posixpath,则意味着您要么选择了错误的平台,要么您的环境不包含它(意味着安装不正确)。

    【讨论】:

      【解决方案2】:

      virtualenv 20 好像有 bug,所以你必须降级到更早的版本。

      1. 通过运行deactivate 确保您不在虚拟环境中。这 要么退出你的 virtualenv 要么告诉你你不在 一个。
      2. 运行pip freeze | grep virtualenv。在输出中是 virtualenv 版本为 20.*?如果是这样,这是您的问题 - 继续 下一步。如果没有,这可能无济于事。
      3. 运行pip install --upgrade virtualenv==16.7.7--upgrade 开关对于两者都是必需的 升级和降级。它会将您的 virtualenv 更改为一个版本 已知工作。

      【讨论】:

        【解决方案3】:

        你有一个错误的 $PYTHONPATH,它可能不包含 virtualenv 库的路径! 一旦你设置了 $PYTHONPATH,路径就只使用这里给出的路径,如果没有在 $PYTHONPATH 中明确定义,则不再考虑从你的 virtualenv 到库的隐式路径。

        如果python单独工作,请先尝试。如果你得到类似的结果,它有一个错误的 PYTHONPATH。

        激活你想要的 virtualenv 并运行:

        $ python
        Traceback (most recent call last):
        File "/data/appl/mmtools/lib/python2.7/site-packages/site.py", line 74, in <module>
        __boot()
        File "/data/appl/mmtools/lib/python2.7/site-packages/site.py", line 2, in __boot
        import sys, os, os.path
        File "/data/appl/py27/lib64/python2.7/os.py", line 49, in <module>
        import posixpath as path
        ImportError: No module named posixpath
        

        然后取消设置 $PYTHONPATH:

        unset PYTHONPATH
        

        现在再次尝试运行 python

        Python 2.7.5 (default, Mar 26 2019, 22:13:06)
        [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
        Type "help", "copyright", "credits" or "license" for more information.
        >>>
        

        如果你有同样的问题,你需要仔细检查 $PYTHONPATH。 请记住:如果您想在多个 virtualenv 之间切换,您必须始终通过添加/交换 virtualenv 的路径和您的包路径来相应地更新您的 $PYTHONPATH,因为激活另一个 virtualenv 时不会自动完成。

        更好的方法是在你的 virtualenv 中使用“.pth”文件。

        1. 取消设置 $PYTHONPATH 或将其从您的登录名中删除(.bash_profile、.bashrc、...)

        2. 在你的 virtualenv 中创建一个文件,例如$VIRTUALENV/lib/python2.7/site-packages/mypackages.pth 每个包的路径一行一行,就像它们在 $PYTHONPATH 中一样:

          /path-to-your-packages/...
          
        3. 运行 python,它应该可以正常启动并找到你的包

        如果您对不同的 virtualenv 有不同的包版本,您可以在 '.pth' 文件中为每个 virtualenv 定义正确的路径,您不应该再定义也不需要 $PYTHONPATH。 激活另一个环境会自动找到正确的路径。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-06
          • 2015-12-09
          • 2012-01-26
          • 2020-12-15
          • 2015-11-17
          • 2016-07-24
          • 2017-07-15
          • 1970-01-01
          相关资源
          最近更新 更多