簡體   English   中英

如何修復 Python 中的“ImportError: No module named ...”錯誤?

[英]How to fix “ImportError: No module named …” error in Python?

修復此 ImportError 錯誤的正確方法是什么?

我有以下目錄結構:

/home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo

我在目錄中

/home/bodacydo/work/project

現在如果我輸入

python ./programs/my_python_program.py

我立即得到

ImportError: No module named foo.tasks

./programs/my_python_program.py包含以下行:

from foo.tasks import my_function

我不明白為什么 python 找不到./foo/tasks.py - 它就在那里。

如果我從 Python shell 執行此操作,則它可以工作:

python
>>> from foo.tasks import my_function

只有當我通過python ./programs/my_python_program.py腳本調用它時它才不起作用。

Python 不會將當前目錄添加到sys.path ,而是添加腳本所在的目錄。將/home/bodacydo/work/projectsys.path$PYTHONPATH

你在 foo 目錄中有一個名為__init__.py的文件嗎? 如果不是,那么 python 不會將 foo 識別為 python 包。

有關更多信息,請參閱 python 教程中有關包部分

比設置PYTHONPATH更好的解決方法是使用python -m module.path

這將正確設置sys.path[0]並且是執行模塊的更可靠方式。

我有一個關於這個問題的快速文章,因為其他回答者已經提到了這樣做的原因python path/to/file.pypath/to放在PYTHONPATH ( sys.path ) 的開頭。

這是一個分步解決方案:

  1. /home/bodacydo/work/project添加一個名為run.py的腳本並像這樣編輯它:

     import programs.my_python_program programs.my_python_program.main()

    (用my_python_program的等效方法替換main() 。)

  2. 轉到/home/bodacydo/work/project
  3. 運行run.py

說明:由於 python 將運行它的腳本的路徑附加到 PYTHONPATH ,運行run.py將附加/home/bodacydo/work/project import foo.tasks會被發現。

將庫添加到 PYTHONPATH 的示例解決方案。

  1. 將以下行添加到您的 ~/.bashrc 或直接運行它:

     export PYTHONPATH="$PYTHONPATH:$HOME/.python"
  2. 然后將您需要的庫鏈接到您的 ~/.python 文件夾中,例如

    ln -s /home/user/work/project/foo ~/.python/

在我看來,我必須考慮foo文件夾是一個獨立的庫。 我可能想考慮將它移動到 python 安裝中的Lib\\site-packages文件夾。 我可能想考慮在那里添加一個foo.pth文件。

我知道它是一個庫,因為./programs/my_python_program.py包含以下行:

from foo.tasks import my_function

所以不要緊, ./programs是同級文件夾./foo 事實上my_python_program.py是作為這樣的腳本運行的:

蟒蛇./programs/my_python_program.py

如果您在使用安裝版本時遇到此問題,請在使用setup.py時確保您的模塊包含在packages

setup(name='Your program',
    version='0.7.0',
    description='Your desccription',
    packages=['foo', 'foo.bar'], # add `foo.bar` here

暫無
暫無

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

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