我有这样的文件结构:
/package/main.py
/package/__init__.py
/package/config_files/config.py
/package/config_files/__init__.py
我正在尝试根据命令行参数从config.py
动态导入main.py
,如下所示:
#!/usr/bin/env python
from importlib import import_module
cmd_arguments = sys.argv
config_str = cmd_arguments[1]
config = import_module(config_str, 'config_files')
但它抱怨ModuleNotFoundError: No module named 'default_config'
。当从/package
如果有更好的方法在运行时通过用户输入加载包,我愿意接受建议。
答案 0 :(得分:1)
您正尝试从嵌套包导入,因此请使用完整的包名称:
config = import_module(config_str, 'package.config_files')
或者,使用相对导入,并将第二个参数设置为package
:
config = import_module('.config_files.{}'.format(config_str), 'package')
这更安全,因为现在config_str
字符串不能用于“突破”config_files
子包。
您确实希望从用户提供的名称中删除点(并且最好将名称限制为仅有效的Python标识符。)