2024-06-16 14:12:24 发布
网友
在我的Python主脚本中,调用了一个webapi。该调用的结果决定了需要运行什么“协议”。这些协议是名为protocols/的子文件夹中的单个python脚本。在
protocols/
那么,在我的主脚本中,如何动态调用这些脚本之一?脚本名是来自API的变量,它位于主脚本的子文件夹中,而不是标准库位置。在
我可以使用subprocess.popen或os.system,但我希望一切尽可能保持在内部。在
subprocess.popen
os.system
Python必须在一个实例中完成,对吗?在
有一个Python内置函数可以处理调用脚本。在
它被称为execfile,您可以通过以下网址了解更多信息:
execfile
https://docs.python.org/2/library/functions.html#execfile
如果我有一个名为testmeagain.py的文件,其中包含以下内容:
testmeagain.py
print "test print"
您可以在不导入其他库的情况下执行此操作:
是的,有可能在一个Python实例中实现这一点。可以按如下方式动态加载单个python脚本:
importlib.import_module()
getattr()
如果只想动态加载模块,请使用importlib.import_module()。假设您的子文件夹protocols中有以下协议:protocols/protocol_1.py包含以下类:
class Protocol(): # some protocol specific code
协议/协议_2.py包含以下类:
首先,我们用将从Web API返回的协议名称定义动态变量:
module = 'protocols.protocol_1'
然后导入importlib并动态加载模块。Protocol类在两个文件中都具有相同的类名,但具有特定于协议的代码。然后,我们用动态加载的协议实例化api_协议:
import importlib Protocol = importlib.import_module(module).Protocol api_protocol = Protocol()
如果还想动态加载类,请使用getattr。假设您的子文件夹protocols中有以下协议:
协议/协议_1.py包含以下类:
class Protocol_1(): # some protocol specific code
class Protocol_2(): # some protocol specific code
module = 'protocols.protocol_1' class_name = 'Protocol_1'
然后我们调用__import__函数来动态加载动态模块的类。然后,我们可以用getattr创建新类,并用动态加载的协议实例化api_协议:
__import__
getattr
mod = __import__(module, fromlist=[class_name]) Protocol = getattr(mod, class_name) api_protocol = Protocol()
假设您从目录运行主Python程序,该目录将protocols作为子文件夹,那么您应该将空的__init__.py添加到protocols目录中,使其成为一个包。在
protocols
__init__.py
然后你可以从那里导入你的协议特定模块,例如
from protocols.http import process_it
在这里,我假设有一个名为process_it的函数
process_it
还有其他方法,如何导入在变量中定义的名称的包,例如在这个SO answer enter link description here。在
在你的情况下,它看起来像:
有一个Python内置函数可以处理调用脚本。在
它被称为
execfile
,您可以通过以下网址了解更多信息:https://docs.python.org/2/library/functions.html#execfile
如果我有一个名为
testmeagain.py
的文件,其中包含以下内容:您可以在不导入其他库的情况下执行此操作:
^{pr2}$是的,有可能在一个Python实例中实现这一点。可以按如下方式动态加载单个python脚本:
importlib.import_module()
动态加载模块getattr()
动态加载模块和类。在备选方案1
如果只想动态加载模块,请使用
importlib.import_module()
。假设您的子文件夹protocols中有以下协议:protocols/protocol_1.py包含以下类:
协议/协议_2.py包含以下类:
首先,我们用将从Web API返回的协议名称定义动态变量:
然后导入importlib并动态加载模块。Protocol类在两个文件中都具有相同的类名,但具有特定于协议的代码。然后,我们用动态加载的协议实例化api_协议:
备选方案2
如果还想动态加载类,请使用getattr。假设您的子文件夹protocols中有以下协议:
协议/协议_1.py包含以下类:
协议/协议_2.py包含以下类:
首先,我们用将从Web API返回的协议名称定义动态变量:
然后我们调用
__import__
函数来动态加载动态模块的类。然后,我们可以用getattr
创建新类,并用动态加载的协议实例化api_协议:假设您从目录运行主Python程序,该目录将
protocols
作为子文件夹,那么您应该将空的__init__.py
添加到protocols
目录中,使其成为一个包。在然后你可以从那里导入你的协议特定模块,例如
在这里,我假设有一个名为
process_it
的函数还有其他方法,如何导入在变量中定义的名称的包,例如在这个SO answer enter link description here。在
在你的情况下,它看起来像:
^{pr2}$相关问题 更多 >
编程相关推荐