1

我有一个具有以下结构的包

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

现在怪事开始了

在调用脚本几次之后(我不记得具体有多少次),上面的 sintax 不再起作用了。因为有一个:ImportError: No module named projectX

编辑:上面的斜体部分是由于我__init__.py在 projectX 源文件夹中缺少一个。所有其他症状仍然存在。

但是,很奇怪,我现在可以从 stats_worker2 成功导入主要工作人员:

import main_worker

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

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

额外的怪异

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

4

1 回答 1

1
  1. 将一个空__init__.py文件添加到源根†</sup>。
  2. 需要设置您的运行时环境,以便项目根††</sup> 在sys.path. 项目根目录不应__init__.py. 项目目录名称不必与包名称匹配,但这也不会真正损害任何东西。
  3. 从 python 源文件中删除任何sys.path.append东西,不要再这样做了。
  4. from projectX import main_workerstats_worker2.py模块的正确导入语句。不要使用import main_worker.

对于第 2 步,通常的方法是通过“安装”你的包,使用python setup.py develop. 即你需要写一个setup.py. 由于您显然没有setup.py, 作为一种廉价的解决方法,您可以export PYTHONPATH=<absolute_path_to_project_root>改为。

†</sup>源根目录是更深projectX的目录,它与包含main_worker.py模块的目录相同。

††</sup>项目根目录是浅projectX目录,它与包含子目录的目录data相同results

于 2017-02-02T19:33:31.933 回答