在Python 3中运行时动态加载模块
在Python3中,建议采用哪种方式延迟加载文件 我通过从Python 2代码中复制过去的代码来构建此函数在Python 3中运行时动态加载模块,python,Python,在Python3中,建议采用哪种方式延迟加载文件 我通过从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),
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'
错误是:
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'
在命令内部,我有一个模块,我在该模块内部调用:
from aws_iam_cli.provider.role import fetch_roles
您可以使用importlib.import_模块在运行时动态加载模块。例如:
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()
我认为这种方法会更干净、更安全,应该与您正在做的工作配合使用。几乎肯定不会,但您还没有真正描述您的问题。你说的“懒散加载”是什么意思?您将如何使用它?为什么不使用标准的导入?我必须在运行时读取、编译和执行文件,而不是静态导入它们。做这里描述的事情@DanielRoseman那么你会推荐什么?你想用它做什么?答案因“我希望最终用户上传python脚本”和“我希望库用户轻松扩展我的库”而异。您的包(cmd_文件夹)中是否有_init_uuuuuuuuuy.py?是的。我知道了。啊-你的cmd_文件夹是完整路径。我们想要的只是最简单的。e、 g.commands.a_commands不幸的是仍然存在问题。我要更新这个问题,让我们一起来。
from aws_iam_cli.provider.role import fetch_roles
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()