Python:奇怪的导入行为

时间:2017-02-02 19:20:33

标签: python import relative-import

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

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:没有名为projectX的模块

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

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

import main_worker

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

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

加分古怪

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

1 个答案:

答案 0 :(得分:0)

  1. 将空__init__.py个文件添加到源根目录
  2. 您需要设置运行时环境,以便sys.path中可以看到项目根目录 ††。项目根应该有__init__.py。项目目录名称与包名称匹配并不是必需的,但这并不会对任何内容造成任何损害。
  3. 从python源文件中删除所有sys.path.append内容,并且不要再这样做了。
  4. from projectX import main_workerstats_worker2.py模块的正确导入语句。不要使用import main_worker
  5. 对于第2步,通常的方法是通过&#34;安装&#34;你的包裹,python setup.py develop。即你需要写一个setup.py。由于您显然没有setup.py,作为便宜的解决方法,您可以export PYTHONPATH=<absolute_path_to_project_root>代替。

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

    †† 项目根目录是浅层projectX目录,它是包含dataresults子目录的同一目录。