У меня было несколько модулей по тому же пути, что и мой скрипт, который я запускаю.
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__
, но не импортировал правильную вещь.
как мне импортировать из модуля в пространство имен на лету?