【问题标题】:python calling custom function from bash shellpython从bash shell调用自定义函数
【发布时间】:2016-01-19 18:20:25
【问题描述】:

如何从 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,方法是输入 like

$ script.py 函数1

$ script.py 函数2

【问题讨论】:

    标签: python bash shell


    【解决方案1】:

    你得到了函数的名字,但你没有运行它。您应该首先检查函数名称是否是您的函数之一,然后执行它:

    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()
    

    【讨论】:

    • dict 的函数不是更好吗?
    • 当命令行不需要额外的输入参数时它可以完美运行。但是当运行函数有类似 def func1(): input_data = input("please input 1 or 2") if input_data == "1": print("1") if input_data == "2": print("2 ") 然后它给出一个 SyntaxError: unexpected EOF while parsing。我该如何处理?
    • @jin890 这是另一个问题,使用 raw_input() 而不是 input() 。请考虑对答案进行投票并将其标记为已接受。
    【解决方案2】:

    我建议使用 argparse 模块:https://docs.python.org/3/library/argparse.html#module-argparse

    你以后会感谢自己的。

    对于您的情况 - 因为您当时只需要调用 1 个函数 - 您可以使用位置参数:

    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 参数调用时会获得一个很好的帮助页面 :)

    【讨论】:

      【解决方案3】:

      @bigOTHER 的回答很好也很正确,但如果您想构建一个相对复杂的文本 UI,不妨看看 Click 之类的东西?

      【讨论】:

        【解决方案4】:

        您可以参考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]()
        

        【讨论】:

          猜你喜欢
          • 2013-03-03
          • 1970-01-01
          • 1970-01-01
          • 2021-09-21
          • 2018-04-22
          • 2012-01-23
          • 1970-01-01
          • 2019-09-05
          • 1970-01-01
          相关资源
          最近更新 更多