Python3 ImportError在不同的构建中不一致 - 为什么同一个项目在不同的人机器上有错误?

时间:2017-04-24 23:21:02

标签: python-3.x importerror

这可能是重复的,但我在搜索数小时后无法解决此问题。

基本问题

项目是一个git回购;有些人得到导入错误,有些则没有。我们在相同的项目上发出相同的命令并获得不同的结果。没有sys.pathPYTHONPATH环境变量的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仓库再次拆了下来,但它仍然没有工作。

基本事实和诊断工具:

  • 无法运行的系统包括Mac OS和Chrome Book
  • 功能系统包括Ubuntu
  • 我们在所有目录
  • 中拥有正确的__init__.py
  • 我们的导入在今天早些时候所有系统上工作
  • 当从github工作系统中拉出时,继续工作并且破损的系统会一直处于断开状态。
  • 我们都在运行python3.5.2

所以显而易见的问题是,可能导致此导入错误的原因

1 个答案:

答案 0 :(得分:2)

我永远不会指望您必须使用您显示的命令行使用的代码。

当您按名称运行脚本时,Python将脚本所在的文件夹放在sys.path的开头,这将确定它在哪里查找要导入的模块。对于命令行python3 ui/main.py,它应该是ui(或者可能是等效的绝对路径,我不确定)。它不是当前的工作目录(将保持设置为src)。

所以真正的问题是为什么你的代码有效?我猜您的某些计算机已将src添加到PYTHONPATH环境变量中,或者您的pipeline包的旧版本可能会安装在搜索路径中的其他位置。我不知道为什么有些机器会突然停止工作。

无论如何,我怀疑该问题的最佳解决方法是更改​​运行脚本的方式。如果ui应该是一个包,则应使用ui/main.py运行python3 -m ui.main