为什么python看不到我的模块?

为什么python看不到我的模块?,python,import,Python,Import,我的文件结构如下: /package/main.py /package/__init__.py /package/config_files/config.py /package/config_files/__init__.py #!/usr/bin/env python from importlib import import_module cmd_arguments = sys.argv config_str = cmd_arguments[1] config = import_m

我的文件结构如下:

/package/main.py
/package/__init__.py
/package/config_files/config.py
/package/config_files/__init__.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')
我试图根据命令行参数从main.py动态导入config.py,如下所示:

/package/main.py
/package/__init__.py
/package/config_files/config.py
/package/config_files/__init__.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出现中断:没有名为“default\u config”的模块。当从/package调用ipython中的类似代码时,不会遇到相同的问题


如果有更好的方法在运行时通过用户输入加载包,我愿意接受建议。

您试图从嵌套包导入,因此请使用完整的包名:

config = import_module(config_str, 'package.config_files')
或者,使用相对导入,并将第二个参数设置为package:

这更安全,因为现在不能使用config_str字符串“中断”config_files子包


您确实希望从用户提供的名称中去掉点,并且最好将名称限制为仅有效的Python标识符。

您的sys.path是什么,其中包含默认配置的目录是什么?您可以包括工作目录和包含配置文件的目录吗?另外,config_files dir上是否有一个_init_uuu.py?嵌套的包名是package.config_files,而不是config_files。最好在脚本中有一个单独的文件。通常,您会让setuptools从setup.py生成该文件。然后,该文件可以导入package.main并运行其中定义的函数。是的,前提是您在包外有一个脚本。有关具体示例,请参见。查找console_脚本条目。然后在将从生成的脚本文件调用主函数的位置。