无法启动Python - 导入错误:没有名为posixpath的模块

6 投票
3 回答
8494 浏览
提问于 2025-04-18 16:09

我有一个用Python写的应用程序,它使用了virtualenv,并且是基于Python 2.7.3的。这个应用程序运行一些任务,使用了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)最近没有重启过,尽我所知也没有安装或更新任何东西。这可能是什么原因呢?

3 个回答

0

你的 $PYTHONPATH 设置错了,可能没有包含虚拟环境库的路径!一旦你设置了 $PYTHONPATH,系统只会使用你在这里给出的路径,如果没有在 $PYTHONPATH 中明确指定,虚拟环境中的库路径就不会被考虑了。

请先试试,单独运行 python。如果结果类似,那就是 $PYTHONPATH 设置错了。

激活你想要的虚拟环境,然后运行:

$ 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。记住:如果你想在多个虚拟环境之间切换,必须每次都更新 $PYTHONPATH,添加或更换虚拟环境和你的包的路径,因为在激活另一个虚拟环境时,这个更新不会自动完成。

更好的方法是使用虚拟环境中的 ".pth" 文件。

  1. 取消设置 $PYTHONPATH,或者从你的登录文件中删除它(比如 .bash_profile, .bashrc 等)。

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

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

如果你在不同的虚拟环境中有不同版本的包,你可以在每个虚拟环境的 '.pth' 文件中定义正确的路径,这样就不需要再定义或使用 $PYTHONPATH 了。激活另一个环境时,系统会自动找到正确的路径。

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,这意味着你可能选择了错误的平台,或者你的环境里根本没有这个模块(也就是说,它安装得不正确)。

6

看起来虚拟环境工具virtualenv的20版本有个bug,所以你需要把它降级到之前的版本。

  1. 首先,确保你没有在虚拟环境中,可以运行 deactivate。这个命令会让你退出虚拟环境,或者告诉你其实你并不在虚拟环境里。
  2. 接着,运行 pip freeze | grep virtualenv。看看输出中是否有virtualenv,并且版本是20.*?如果有,那就是问题所在,接着往下走。如果没有,那可能这个方法对你没帮助。
  3. 然后,运行 pip install --upgrade virtualenv==16.7.7。这里的 --upgrade 选项是必须的,不管是升级还是降级都需要用到。这个命令会把你的virtualenv换成一个已知可以正常工作的版本。

撰写回答