如何运行存储在不同文件中的Python函数
我知道怎么在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.
有什么建议吗?
6 个回答
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
在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)
补充:
正如mike所说,你需要在你的__init__.py
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]