импорт модулей из пространств имен в Python - PullRequest
0 голосов
/ 09 октября 2018

У меня было несколько модулей по тому же пути, что и мой скрипт, который я запускаю.

my_dir/
├── my_script.py
├── module_script_1.py
└── module_script_2.py

У меня был код для импорта этих модулей на лету, когда они мне были нужны, и он работал какcharm:

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__, но не импортировал правильную вещь.

как мне импортировать из модуля в пространство имен на лету?

1 Ответ

0 голосов
/ 09 октября 2018

во время моего исследования я обнаружил:

Как правильно использовать функцию импорта python __import __ ()

, который предложил мне попробовать:

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

который работал.

...