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 缓存无效)
- 将一个空的
__init__.py
文件添加到 源根目录 †。
- 您需要设置运行时环境,以便 项目根目录†† 在
sys.path
中可见。项目根应该 而不是 有一个 __init__.py
。项目目录名称不必与包名称匹配,但这也没有什么坏处。
- 从 python 个源文件中删除所有
sys.path.append
内容,以后再也不要这样做了。
from projectX import main_worker
是 stats_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=的同一目录] 子目录。
我有一个结构如下的包
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 缓存无效)
- 将一个空的
__init__.py
文件添加到 源根目录 †。 - 您需要设置运行时环境,以便 项目根目录†† 在
sys.path
中可见。项目根应该 而不是 有一个__init__.py
。项目目录名称不必与包名称匹配,但这也没有什么坏处。 - 从 python 个源文件中删除所有
sys.path.append
内容,以后再也不要这样做了。 from projectX import main_worker
是stats_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=的同一目录] 子目录。