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

1 投票
6 回答
3724 浏览
提问于 2025-04-16 15:35

我知道怎么在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]

撰写回答