从python中的命名空间导入模块

时间:2018-10-09 15:34:36

标签: python namespaces python-import

我的一些脚本与正在运行的脚本位于同一路径。

fatalError()

我有一些代码可以在需要时即时导入这些模块,它的工作就像一个魅力:

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' 行,但是没有导入正确的内容。

如何即时从命名空间中的模块导入?

1 个答案:

答案 0 :(得分:0)

在研究过程中,我发现:

How to use python's import function properly __import__()

建议我尝试

module = importlib.import_module('root_dir.modules_dir.' + name_value)

有效。