簡體   English   中英

無法啟動 Python - ImportError: No module named posixpath

[英]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 有一個錯誤,所以你必須降級到早期版本。

  1. 通過運行deactivate確保您不在virtualenv 中。 這將退出您的 virtualenv 或告訴您您不在其中。
  2. 運行pip freeze | grep virtualenv pip freeze | grep virtualenv 輸出中的virtualenv 是20.* 版本嗎? 如果是這樣,這就是您的問題——繼續下一步。 如果沒有,這可能無濟於事。
  3. 運行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”文件。

  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。 激活另一個 env 會自動找到正確的路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM