【问题标题】:Python: weird import behaviourPython:奇怪的导入行为
【发布时间】:2023-03-09 15:21:01
【问题描述】:

我有一个结构如下的包

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 缓存失效)

【问题讨论】:

  • 您在 projectX 中是否缺少__init__.py
  • 是的,对不起,我在某个时候删除了它以进行测试,忘记添加了。既然我已经恢复了它,我将相应地编辑这个问题(剧透:它实际上是一样的)

标签: python python-import python-packaging relative-import


【解决方案1】:
  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 步,执行此操作的常用方法是使用 python setup.py develop“安装”您的包。即你需要写一个setup.py。由于您显然没有setup.py,因此作为一种廉价的解决方法,您可以改为export PYTHONPATH=<absolute_path_to_project_root>

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

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

【讨论】:

  • 我将__init__.py 文件添加到源项目X。现在导入工作正常。但是,在尝试export PYTHONPATH=<absolute_path_to_project_root> 之后,问题仍然存在。 Sphinx 找不到 projectX 包的任何模块,我的 IDE 仍然将 stats_worker 标记为未使用的导入。
  • 您还需要在 IDE 中导出环境变量。它不会从 bash 会话中获取那些,因为它不使用那个环境。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多