在Python中通过变量动态导入相对脚本

2024-06-16 14:12:24 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的Python主脚本中,调用了一个webapi。该调用的结果决定了需要运行什么“协议”。这些协议是名为protocols/的子文件夹中的单个python脚本。在

那么,在我的主脚本中,如何动态调用这些脚本之一?脚本名是来自API的变量,它位于主脚本的子文件夹中,而不是标准库位置。在

我可以使用subprocess.popenos.system,但我希望一切尽可能保持在内部。在

Python必须在一个实例中完成,对吗?在


Tags: 实例脚本文件夹api协议标准os动态
3条回答

有一个Python内置函数可以处理调用脚本。在

它被称为execfile,您可以通过以下网址了解更多信息:

https://docs.python.org/2/library/functions.html#execfile

如果我有一个名为testmeagain.py的文件,其中包含以下内容:

print "test print"

您可以在不导入其他库的情况下执行此操作:

^{pr2}$

是的,有可能在一个Python实例中实现这一点。可以按如下方式动态加载单个python脚本:

  1. 仅使用importlib.import_module()动态加载模块
  2. 使用getattr()动态加载模块和类。在

备选方案1

如果只想动态加载模块,请使用importlib.import_module()。假设您的子文件夹protocols中有以下协议:

protocols/protocol_1.py包含以下类:

class Protocol():
    # some protocol specific code

协议/协议_2.py包含以下类:

class Protocol():
    # some protocol specific code

首先,我们用将从Web API返回的协议名称定义动态变量:

module = 'protocols.protocol_1' 

然后导入importlib并动态加载模块。Protocol类在两个文件中都具有相同的类名,但具有特定于协议的代码。然后,我们用动态加载的协议实例化api_协议:

import importlib

Protocol = importlib.import_module(module).Protocol

api_protocol = Protocol()

备选方案2

如果还想动态加载类,请使用getattr。假设您的子文件夹protocols中有以下协议:

协议/协议_1.py包含以下类:

class Protocol_1():
    # some protocol specific code

协议/协议_2.py包含以下类:

class Protocol_2():
    # some protocol specific code

首先,我们用将从Web API返回的协议名称定义动态变量:

module = 'protocols.protocol_1' 
class_name = 'Protocol_1'

然后我们调用__import__函数来动态加载动态模块的。然后,我们可以用getattr创建新类,并用动态加载的协议实例化api_协议:

mod = __import__(module, fromlist=[class_name])
Protocol = getattr(mod, class_name)
api_protocol = Protocol()

假设您从目录运行主Python程序,该目录将protocols作为子文件夹,那么您应该将空的__init__.py添加到protocols目录中,使其成为一个包。在

然后你可以从那里导入你的协议特定模块,例如

from protocols.http import process_it

在这里,我假设有一个名为process_it的函数

还有其他方法,如何导入在变量中定义的名称的包,例如在这个SO answer enter link description here。在

在你的情况下,它看起来像:

^{pr2}$

相关问题 更多 >