![](/img/trans.png)
[英]Can't Import Requests into Python: ImportError no module named urllib3
[英]Can't start Python - ImportError: No module named posixpath
所以我有一個用 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)最近沒有重新啟動,據我所知沒有安裝/更新。 可能發生了什么?
看起來 virtualenv 20 有一個錯誤,所以你必須降級到早期版本。
deactivate
確保您不在virtualenv 中。 這將退出您的 virtualenv 或告訴您您不在其中。pip freeze | grep virtualenv
pip freeze | grep virtualenv
。 輸出中的virtualenv 是20.* 版本嗎? 如果是這樣,這就是您的問題——繼續下一步。 如果沒有,這可能無濟於事。pip install --upgrade virtualenv==16.7.7
。 --upgrade
開關對於升級和降級都是必需的。 它會將您的 virtualenv 更改為已知可以工作的版本。您的虛擬環境顯然創建不正確或在創建后被修改。 posixpath
是一個內置模塊,它是os.path
模塊的動態選擇的替代方案之一。 在類 Unix 系統上使用。 它應該是所有 Python 環境的標准部分。
In [2]: import posixpath
In [3]: import os.path
In [4]: os.path is posixpath
Out[4]: True
如果您無法導入posixpath
則意味着您以某種方式選擇了錯誤的平台,或者您的環境不包含它(意味着它安裝不正確)。
您輸入了錯誤的 $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”文件。
取消設置 $PYTHONPATH 或從您的登錄名中刪除它(.bash_profile、.bashrc、...)
在您的 virtualenv 中創建一個文件,例如 $VIRTUALENV/lib/python2.7/site-packages/mypackages.pth,每個包路徑一行,就像它們在 $PYTHONPATH 中一樣:
/path-to-your-packages/...
運行 python,它應該可以正常啟動並找到你的包
如果您對各種 virtualenv 有不同的包版本,您可以在 '.pth' 文件中為每個 virtualenv 定義正確的路徑,並且您不應再定義或需要 $PYTHONPATH。 激活另一個 env 會自動找到正確的路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.