Python:奇怪的导入行为

Python: weird import behaviour

我有一个结构如下的包

projectX
├── data 
├── results
└── projectX
    ├── stats
    │   ├── __init__.py
    │   ├── stats_worker.py
    │   └── stats_wroker2.py
    ├── __init__.py
    ├── main_worker.py
    └── interface.py

请注意,项目文件夹和源文件夹共享相同的名称 (projectX)。

问题有点复杂,需要做一些前提

场所:

我总是启动界面,并且总是启动界面。没有调用其他脚本

我的问题首先出现在尝试从 stats_worker2 导入 main_worker 时。

我无法使它作为相对导入工作。所以我试着 从 stats_worker2 和界面(分别)将父目录附加到 sys.path。各种方法都试过了,不记得了。

通过将以下行添加到 stats_worker2

,它终于起作用了
sys.path.append('../projectX')
from projectX import main_worker

怪事开始了

在调用脚本几次后(我不记得具体有多少次),上面的语法不再起作用。因为有一个: 导入错误:没有名为 projectX

的模块

编辑:以上斜体部分是因为我在 projectX 源文件夹中缺少 __init__.py。所有其他症状仍然存在。

但是,奇怪的是,我现在可以通过以下方式从 stats_worker2 成功导入主要工作人员:

import main_worker

没有任何 目录附加到 sys.path!

但是,Sphinx 不再工作了!具体来说,它无法导入 projectX 包的所有模块。

奖金怪异

我以前从界面成功导入stats_worker,现在我仍然可以导入它,但是我的IDE(Pycharm)将导入标记为未使用。它实际上已被使用,如果我评论导入,界面会按预期崩溃(我已经使 Pycharm 缓存无效)

  1. 将一个空的 __init__.py 文件添加到 源根目录
  2. 您需要设置运行时环境,以便 项目根目录††sys.path 中可见。项目根应该 而不是 有一个 __init__.py。项目目录名称不必与包名称匹配,但这也没有什么坏处。
  3. 从 python 个源文件中删除所有 sys.path.append 内容,以后再也不要这样做了。
  4. from projectX import main_workerstats_worker2.py 模块的正确导入语句。不要使用 import main_worker

对于第 2 步,通常的方法是通过 "installing" 您的包裹,使用 python setup.py develop。也就是说,你需要写一个 setup.py。由于您显然没有 setup.py,作为一种廉价的解决方法,您可以 export PYTHONPATH=<absolute_path_to_project_root> 代替。

源代码根目录是更深的 projectX 目录,它与包含 main_worker.py 模块的目录相同。

††项目根目录是浅projectX目录,它是包含data和[=25=的同一目录] 子目录。