我知道如何在C中执行此操作,但我不确定如何在python中执行此操作。我正在尝试创建一个python程序,它将从外部文件中读取,然后执行从该文件中读取的函数名称。例如:
文件结构:
main.py
map.py
Scripts/
script1.py
map.py只包含一个数组和一个获取正确数组索引的函数:
map = ["One","script1.function_one","Two","scrip1.function_two"]
def return_mapping(str):
for i in range(0,len(map)):
if str in map[i]:
return map[i+1]
函数:“function_one()”和“function_two()”在script1.py中定义。 main.py将包含以下内容:
selection = raw_input("What function would you like to run?")
function_ptr = map.return_mapping(selection)
#This is where I don't know what the correct code is... I want to now execute
#whatever function was returned.
有什么建议吗?
答案 0 :(得分:7)
在Scripts/
目录中,添加名为__init__.py
然后在map.py文件中,执行以下操作:
from Scripts import script1
map = {"One" : script1.function_one, "Two" : script1.function_two]
def return_mapping(str):
return map[str]
答案 1 :(得分:3)
在map.py中,以下内容更简单:
import Scripts.script1 as script1
map = {"One" : script1.function_one, "Two" : script1.function_two]
def return_mapping(str):
return map[str]
在main.py中:
selection = raw_input("What function would you like to run?")
function_ptr = map.return_mapping(selection)
# to call the function: function_ptr(my_args)
修改强>:
正如迈克所说,你必须在你的__init__.py
目录中放一个名为Scripts
的空文件
答案 2 :(得分:0)
您需要使用import
。这可能就是你要找的东西:
from Scripts.script1 import function_one, function_two
print choices:
print "function_one"
print "function_two"
selection = raw_input("What function would you like to run?")
if selection == "function_one":
function_one()
elif selection == "function_two":
function_two()
else:
print "not a choice"
修改:鉴于您的其他要求,请考虑以下事项:
main.py
from Scripts.script1 import functions
print choices:
for func in script1.functions:
print func
selection = raw_input("What function would you like to run?")
script1.functions[selection]()
并在script1.py
中from collections import defaultdict
def _no_function(*args, *kwargs):
print "No such function"
functions = defaultdict(_no_function)
def function_one():
pass
functions['function_one'] = function_one
此解决方案允许您在不使用eval
的情况下调用任意函数,只要它们被添加到各自源文件中的字典中即可。此外,通过使用defaultdict
,您可以在请求的人不存在时提供功能。最终,import
仍然是您所需要的。
答案 3 :(得分:0)
如前所述,您应该使用import
。可在此处找到更多信息:Python Documentation
答案 4 :(得分:0)
Mike Lewis或Simon的建议可能就是你想要的,但是如果你真的需要调用一个名字在运行时确定的函数,你可以这样做:
result = eval(function_ptr + '()')
其中function_ptr
是包含函数名称的字符串。
答案 5 :(得分:0)
如果您希望能够使用任何文件的路径,无论它在哪里:
import imp
import sys
mod = imp.load_source('any_name', 'path_to_your_file')
# this will get and execute your function
get_attr(mod, 'your_function_name')()
# if you want to execute load_source more than once you have to do the following, otherwise the code is not updated:
del sys.modules['any_name']