如何运行存储在不同文件中的python函数

时间:2011-04-12 14:36:24

标签: 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 :(得分: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']