繁体   English   中英

导入模块时遇到问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM