[英]Dynamically loading modules at runtime in Python 3
在Python 3中延遲加載文件的推薦方法是哪種?
我已經通過Python 2代碼的復制粘貼構建了此功能
def get_command(self, ctx, cmd_name):
ns = {}
fn = os.path.join(cmd_folder, 'cmd_{}.py'.format(cmd_name))
with open(fn) as f:
code = compile(f.read(), str(fn), 'exec')
eval(code, ns, ns)
return ns['cli']
但我不確定這是否正確。 它使用compile
和eval
編輯
使用如下所示的import
后:
def get_command(self, ctx, cmd_name):
cmd_mod = import_module('{}.cmd_{}'.format(cmd_folder, cmd_name))
結果是:
File "aws_iam_cli/cli.py", line 23, in get_command
cmd_mod = import_module('{}.cmd_{}'.format(cmd_folder, cmd_name))
File "/Users/salvatoremazzarino/awsiam/venv/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 941, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
ModuleNotFoundError: No module named '/Users/salvatoremazzarino/awsiam/aws_iam_cli/commands'
編輯#2:
def get_command(self, ctx, cmd_name):
mod = import_module('aws_iam_cli.commands.cmd_{}'
.format(cmd_name))
return mod.cli
和錯誤:
File "/Users/salvatoremazzarino/awsiam/venv/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 941, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 941, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'aws_iam_cli'
這是目錄樹:
├── aws_iam_cli
│ ├── __init__.py
│ ├── cli.py
│ ├── commands
│ │ ├── __init__.py
│ │ ├── __pycache__
│ │ └── cmd_dump.py
│ └── provider
│ ├── __init__.py
│ ├── policy.py
│ └── role.py
在命令內部,我有一個模塊,並在該模塊內調用:
from aws_iam_cli.provider.role import fetch_roles
您可以使用importlib.import_module在運行時動態加載模塊。 因此,例如:
from importlib import import_module
# load module
pckg_name = 'commands' # I assume all your commands are in this pckg
cmd_mod = import_module('{}.cmd_{}'.format(pckg_name, cmd_name))
# run command (I'm assuming the module contains a function with the 'cmd_name')
cmd_mod.cmd_name()
我認為這種方法會更清潔,更安全,並且應該與您的工作配合使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.