【问题标题】:run a function (from a .py file) from a linux console从 linux 控制台运行一个函数(从 .py 文件)
【发布时间】:2011-05-13 08:55:28
【问题描述】:

可能标题不是很清楚,我详细说明一下。

我有一个 python 脚本,可以打开一个 ppm 文件,应用一个选定的过滤器(旋转...)并创建一个新图片。直到这里一切正常。

但我想通过 linux 控制台做同样的事情,例如:

ppmfilter.py ROTD /path/imageIn.ppm /path/imageOut.ppm

这里 ROTD 是应用旋转的函数的名称。

我不知道该怎么做,我正在寻找一个允许我这样做的库。

期待您的帮助。

P.S.:我使用的是 python 2.7

【问题讨论】:

    标签: python console ppm


    【解决方案1】:

    有一个比较简单的方法:

    您可以使用“globals()”来确定全局名称(函数、变量等)。这为您提供了所有全局符号的字典。您只需要检查类型(使用 type() 和模块类型),如果它是一个函数,您可以使用 sys.argv 调用它:

    import types
    import sys
    
    def ROTD(infile, outfile):
        # do something
    
    if __name__ == '__main__':
        symbol = globals().get(sys.argv[1])
        if hasattr(symbol, '__call__'):
            symbol(*sys.argv[2:])
    

    这会将程序参数(不包括文件名和命令名)传递给函数。

    编辑:请不要忘记错误处理。为了清楚起见,我省略了它。

    【讨论】:

    • 我会添加一个if __name__ == "__main__",因此您仍然可以导入模块而无需它尝试这样做。另外,您应该查找sys.argv[1],而不是sys.argv[0](这将是脚本的名称)。
    • @Thomas:感谢您的提示,我已修复。
    • 酷。要更加pythonic,您可以测试if hasattr(symbol, "__call__"),而不是检查函数类型。这将让您以相同的方式调用一个类(或任何其他可调用对象),并为您节省导入。
    • :-)。你现在不再需要import types
    【解决方案2】:

    一个很好的方法是在你的模块中定义一个大字典{alias: function}。例如:

    actions = {
        'ROTD': ROTD,
        'REFL': reflect_image,
        'INVT': invIm,
    }
    

    你明白了。然后获取第一个命令行参数并将其解释为该字典的键,将actions[k] 应用于其余参数。

    【讨论】:

      【解决方案3】:

      您可以在 ppmfilter.py main 部分中定义:

      if __name__ == "__main__":
        import sys
        ROTD(sys.argv[1], sys.argv[2]) # change according to the signature of the function
      

      并称之为:python ppmfilter.py file1 file2

      您也可以在包含您的 *.py 文件的目录中运行python -c

      python -c "import ppmfilter; ppmfilter.ROTD('/path/to/file1', '/path/to/file2')"
      

      【讨论】:

        【解决方案4】:

        使用 main() 函数:

        def main()
           # call your function here
        
        if __name__ == "__main__":
           main()
        

        【讨论】:

        • 另外,您需要添加#!/usr/bin/env python(或类似的)作为文件的第一行,使其可执行,并且可能在if __name__ ... 块中,解析命令行参数并处理它们(可能通过将它们传递给您的函数)。
        猜你喜欢
        • 2017-07-28
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-21
        • 1970-01-01
        相关资源
        最近更新 更多