如何从bash shell调用python脚本中的自定义函数?
我尝试使用sys.argv [1],但无法正常工作。
例如,
import sys
if __name__=='__main__':
try:
func = sys.argv[1]
except: func = None
def function1():
~~~~~~~~
return a
def function2():
~~~~~~~~
return b
在这里,我想通过输入类似
来调用函数1或函数2$ script.py function1
$ script.py function2
答案 0 :(得分:6)
您正在获取功能名称,但您没有运行它。您应首先检查func名称是否是您的函数之一,而不是执行它:
if __name__=='__main__':
try:
func = sys.argv[1]
except:
func = None
functions = {
"function1": function1,
"function2": function2
}
if func in functions:
functions[func]()
更简单的解决方案:
if func == "function1":
function1()
elif func == "function2":
function2()
答案 1 :(得分:3)
我建议使用argparse模块:https://docs.python.org/3/library/argparse.html#module-argparse
你以后会感谢自己。
对于你的情况 - 因为你当时只需要调用一个函数 - 你可以使用位置参数:
import argparse
def function1():
print("1")
def function2():
print("2")
parser = argparse.ArgumentParser()
F_MAP = {'function1': function1,
'function2': function2}
parser.add_argument('function', choices=F_MAP.keys())
args = parser.parse_args()
F_MAP[args.function]()
作为奖励,当使用-h参数调用时,您会得到一个很好的帮助页面:)
答案 2 :(得分:1)
@ bigOTHER的答案是好的和正确的,但是如果你想构建一个相对复杂的文本用户界面,可能会看看像Click这样的东西吗?
答案 3 :(得分:1)
您可以参考Display a list of user defined functions in the Python IDLE session
import types
list_function = [f for f in globals().values() if type(f) == types.FunctionType]
这将返回可用函数列表,然后你可以检查其中是否有任何包含sys.argv [1],如果是,那么你可以调用你的函数
list_function[index]()