为什么主模块看不到里面的子模块?
Why can't Main Module see sub-module inside it?
我正在编辑以最小化为可重现的示例:
cal.py
的内容
import M1
M1.SM1.nice_hello.hello()
目录结构:
M1/
├── __init__.py
└── SM1
├── __init__.py
└── nice_hello.py
SM1/nice_hello.py 的内容:
def hello():
print(f'Hello my friend!!!')
所有其他文件(init.py 文件)都是空的。
到运行cal.py:
export PYTHONPATH=/PATH/TO/M1 ; python cal.py
但这给了我以下错误:
Traceback (most recent call last):
File "cal.py", line 3, in <module>
M1.SM1.nice_hello.hello()
AttributeError: module 'M1' has no attribute 'SM1'
如果您导入整个模块名称,即在文件 cal.py
中,它应该可以工作
import M1.SM1.nice_hello
M1.SM1.nice_hello.hello()
子模块不会被递归导入,如果你想要这样,你可以执行以下操作:-
A) 在 M1 模块中创建 init.py 文件(我想你已经有了)
B) 在您的 init.py 文件中包含以下代码:-
import importlib
import pkgutil
def import_submodules(package, recursive=True):
""" Import all submodules of a module, recursively, including subpackages
:param package: package (name or actual module)
:type package: str | module
:rtype: dict[str, types.ModuleType]
"""
if isinstance(package, str):
package = importlib.import_module(package)
results = {}
for loader, name, is_pkg in pkgutil.walk_packages(package.__path__):
full_name = package.__name__ + '.' + name
results[full_name] = importlib.import_module(full_name)
if recursive and is_pkg:
results.update(import_submodules(full_name))
return results
这将帮助您导入该包 (M1) 中的所有子模块
现在在您的 cal.py 中执行以下操作:-
import M1
M1.import_submodules(M1)
def hello():
print(f'Hello my friend!!!')
希望这能解决您的问题,并可能指导您如何在 python
中递归导入模块
参考:- How to import all submodules?
如果需要进一步说明,请在评论中联系我们。很乐意提供帮助
我正在编辑以最小化为可重现的示例:
cal.py
的内容import M1
M1.SM1.nice_hello.hello()
目录结构:
M1/
├── __init__.py
└── SM1
├── __init__.py
└── nice_hello.py
SM1/nice_hello.py 的内容:
def hello():
print(f'Hello my friend!!!')
所有其他文件(init.py 文件)都是空的。
到运行cal.py:
export PYTHONPATH=/PATH/TO/M1 ; python cal.py
但这给了我以下错误:
Traceback (most recent call last):
File "cal.py", line 3, in <module>
M1.SM1.nice_hello.hello()
AttributeError: module 'M1' has no attribute 'SM1'
如果您导入整个模块名称,即在文件 cal.py
import M1.SM1.nice_hello
M1.SM1.nice_hello.hello()
子模块不会被递归导入,如果你想要这样,你可以执行以下操作:-
A) 在 M1 模块中创建 init.py 文件(我想你已经有了)
B) 在您的 init.py 文件中包含以下代码:-
import importlib
import pkgutil
def import_submodules(package, recursive=True):
""" Import all submodules of a module, recursively, including subpackages
:param package: package (name or actual module)
:type package: str | module
:rtype: dict[str, types.ModuleType]
"""
if isinstance(package, str):
package = importlib.import_module(package)
results = {}
for loader, name, is_pkg in pkgutil.walk_packages(package.__path__):
full_name = package.__name__ + '.' + name
results[full_name] = importlib.import_module(full_name)
if recursive and is_pkg:
results.update(import_submodules(full_name))
return results
这将帮助您导入该包 (M1) 中的所有子模块
现在在您的 cal.py 中执行以下操作:-
import M1
M1.import_submodules(M1)
def hello():
print(f'Hello my friend!!!')
希望这能解决您的问题,并可能指导您如何在 python
中递归导入模块参考:- How to import all submodules?
如果需要进一步说明,请在评论中联系我们。很乐意提供帮助