【问题标题】:importing modules from namespaces in python从python中的命名空间导入模块
【发布时间】: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


    【解决方案1】:

    在我的研究中我发现:

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

    建议我试试:

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

    哪个有效。

    【讨论】:

      猜你喜欢
      • 2019-01-08
      • 2011-04-08
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      相关资源
      最近更新 更多