这可能是重复的,但我在搜索数小时后无法解决此问题。
项目是一个git回购;有些人得到导入错误,有些则没有。我们在相同的项目上发出相同的命令并获得不同的结果。没有sys.path
或PYTHONPATH
环境变量的tomfoolery(我们希望保持这种方式;)
src/ # Project Root
pipeline/
pipeline.py
ui/
main.py # This is the script I want to run
和main.py
从一些导入开始:
from pipeline.pipeline import Pipeline
# Amazing Code follows here! Really folks, this is some
# tremendous code
我正在与其他六位开发人员一起使用Python3。我们的一些系统工作得很好;从python3 ui/main.py
目录中调用src/
并运行它。与此同时,其他人会调用python3 ui/main.py
(同样的事情)并得到一个ImportError:
ImportError: No module named pipeline
当我从print(os.getcwd())
运行main.py
时,我看到src/
打印到stdout(在所有系统上,包括带有ImportErrors的系统)。我不能为我的生活找出导致错误发生的原因,因为pipeline
模块应该从CWD可见。我们都在使用git而且我们并没有忽略__init__.py
中的.gitignore
文件,所以在拉动时应该刷新它们。我的一位同事甚至将整个git仓库再次拆了下来,但它仍然没有工作。
__init__.py
所以显而易见的问题是,可能导致此导入错误的原因?
答案 0 :(得分:2)
我永远不会指望您必须使用您显示的命令行使用的代码。
当您按名称运行脚本时,Python将脚本所在的文件夹放在sys.path
的开头,这将确定它在哪里查找要导入的模块。对于命令行python3 ui/main.py
,它应该是ui
(或者可能是等效的绝对路径,我不确定)。它不是当前的工作目录(将保持设置为src
)。
所以真正的问题是为什么你的代码有效?我猜您的某些计算机已将src
添加到PYTHONPATH
环境变量中,或者您的pipeline
包的旧版本可能会安装在搜索路径中的其他位置。我不知道为什么有些机器会突然停止工作。
无论如何,我怀疑该问题的最佳解决方法是更改运行脚本的方式。如果ui
应该是一个包,则应使用ui/main.py
运行python3 -m ui.main
。