我使用
importlib.import_module()
从不同的文件夹导入模块,但它只识别顶级目录名称。这是我的环境。
test目录下有a、b、c三个文件夹
(py312) root@ubuntu2004-host:~# tree test/
test/
├── a
│ ├── aa
│ │ └── aaa
│ │ └── aaaa
│ └── a.py
├── b
└── c
└── cxxx.py
6 directories, 2 files
a.py的代码如下
import importlib
import sys
print(sys.path)
params=importlib.import_module('c.cxxx')
params.args
params.C
c.py的代码如下
args = {'a': 1}
class C:
def C(self):
pass
时执行a.py总是报错
ModuleNotFoundError: No module named 'c'
,也就是说识别的是目录c而不是模块cxxx
(py312) root@ubuntu2004-host:~/test# python3.12 a/a.py
['/root/test/a', '/usr/lib/python312.zip', '/usr/lib/python3.12', '/usr/lib/python3.12/lib-dynload', '/usr/local/lib/python3.12/dist-packages', '/usr/lib/python3/dist-packages']
Traceback (most recent call last):
File "/root/test/a/a.py", line 5, in <module>
params=importlib.import_module('c.cxxx')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/importlib/__init__.py", line 90, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
File "<frozen importlib._bootstrap>", line 1310, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
File "<frozen importlib._bootstrap>", line 1324, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'c'
原来的python版本是3.11。我也尝试了Python 3.12.4和3.8,但它们也给出了同样的错误。
问题在于 Python 的模块导入机制。当你执行
importlib.import_module('c.cxxx')
时,Python 会将 "c" 解释为一个顶级的包名,而不是相对于当前文件路径的子目录。
为了解决这个问题,你需要将 "test" 目录添加到 Python 的搜索路径中,或者使用相对导入。
方法一:添加 "test" 目录到 Python 搜索路径
import importlib
import sys
# 将 "test" 目录添加到 sys.path
sys.path.append('/root/test')
# 导入模块
params = importlib.import_module('c.cxxx')
# 使用模块
params.args
params.C
这个方法将 "test" 目录添加到
sys.path
中,这样 Python 就能找到其中的模块了。
方法二:使用相对导入
from ..c import cxxx
# 使用模块
cxxx.args
cxxx.C
这个方法使用了相对导入,
..
表示上一级目录,即 "test" 目录。这样 Python 就会在 "test/c" 目录下找到
cxxx.py
模块。
注意事项:
-
方法一需要修改
sys.path
,可能会影响到其他模块的导入。 - 方法二只能在包内部使用,不能在包外部使用。
建议根据你的实际情况选择合适的方法。
标签:python,python-3.x From: 78791513