【发布时间】:2019-03-14 10:40:36
【问题描述】:
我有一些模块与我正在运行的脚本在同一路径中。
my_dir/
├── my_script.py
├── module_script_1.py
└── module_script_2.py
我有一些代码可以在需要时即时导入这些模块,它就像一个魅力:
print('Starting python module ' + name_value)
module = __import__(name_value)
df = getattr(module, name_value)(arg1 = val1)
print('Finished python module ' + name_value, df)
但是,随着系统变得越来越大,我正在尝试将其重构为更好的设计。
我正在尝试使用命名空间,所以现在这是我的文件夹结构:
root_dir/
├── modules_dir/
| ├── __init__.py
│ ├── module_script_1.py
│ └── module_script_2.py
├── workflow_dir/
│ └── my_script.py
└── setup.py
现在,在setup.py 中,我们有一个名为root_dir 的命名空间:
setup(
name='root_dir',
namespace_packages=['root_dir'],
packages=[f'root_dir.{p}' for p in find_packages(where='root_dir')],
...
这就是我的设置,但我似乎无法轻松复制我之前动态导入模块的功能。现在让我向您展示我在my_script.py 中的内容:
import root_dir.modules_dir # not necessary - just testing if import works
...
print('Attempting to import python module ' + name_value)
module = __import__('root_dir.modules_dir.' + name_value)
df = getattr(module, name_value)...
这给出了一个错误:
df = getattr(module, name_value)...
AttributeError: module 'root_dir' has no attribute 'module_script_1'
你能告诉我在这种情况下如何正确使用命名空间吗?它似乎越过了__import__ 行,但没有导入正确的东西。
如何从命名空间中的模块动态导入?
【问题讨论】:
标签: python namespaces python-import