[英]Trouble importing a module that imports a module
我在使用单独的模块来构造代码的 python package 时遇到问题。 package 本身正在工作,但是当从另一个环境导入时失败并出现 ModuleNotFound 错误。 这是结构:
Project-root
|
|--src/
| __init__.py
| module_a.py
| module_b.py
| module_c.py
| module_d.py
|--tests
etc.
在 module_a.py 我有:
from module_a import function_a1,...
from module_b import function_b1,...
from module_c import function_c1,...
在 module_c 我导入 module_d 喜欢:
from module_d import function_d1,...
如上所述,直接从 CLI 执行 module_a 或 module_c 按预期工作,我在测试目录中创建的单元测试也可以工作(在 sys.path.insert 的帮助下),但是如果我创建一个新环境并导入package 我收到以下错误:
>>> import module_a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/<abs_path>/.venv/lib/python3.9/site-packages/module_a.py", line 22, in <module>
from module_c import function_c1, function_c2
File /<abs_path>/.venv/lib/python3.9/site-packages/module_c.py", line 9, in <module>
import module_d
ModuleNotFoundError: No module named 'module_d'
>>>
除了将模块 c 和 d 的代码组合在一个文件中之外,我已经用尽了所有想法来克服这个问题,我不想这样做,或者重新考虑流程以便从 module_a 导入所有模块。 任何有关如何解决此问题的建议将不胜感激。
问题归结为理解导入系统和PYTHONPATH的基础知识。
当您尝试导入模块( import module_a
)时,Python 将在sys.path
中列出的每个目录中按顺序搜索。 如果一个目录与名称 ( module_a
) 1匹配,那么它运行__init__.py
文件就是这样存在的。
当您收到 [ https://docs.python.org/3/library/exceptions.html#ImportError
] 时,这意味着sys.path
中没有包含所要求名称的目录的目录。
你说你的测试你做了类似sys.path.insert(0, "some/path/")
,但这不是一个解决方案,只是一个坏的修复。
您应该做的是将PYTHONPATH
环境变量设置为包含模块所在的目录,在您的情况下为Project-root/src
。 这样,就无需使用sys.path.insert
或在导入语句中摆弄相对/绝对路径。
创建新环境时,只需将环境变量PYTHONPATH
设置为包含Project-root/src
即可。 这就是安装常规 Python 模块(库)的工作方式:它们都被放入site-packages
的目录中。
1 :自从旧的 Python 版本以来,这发生了变化,以前需要目录包含__init__.py
文件
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.