如何编写Python文件,使其既可以是模块又可以是具有命令行选项和管道功能的脚本?

2024-06-16 10:13:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在考虑如何使Python文件成为可导入的模块,以及能够接受命令行选项和参数以及管道数据的脚本。这应该怎么做?在

我的尝试似乎奏效了,但我想知道我的方法是否应该是这样的事情(如果应该这样做的话)。会不会有一些我没有考虑过的复杂情况(比如在进口时)?在

#!/usr/bin/env python

"""
usage:
    program [options]

options:
    --version        display version and exit
    --datamode       engage data mode
    --data=FILENAME  input data file [default: data.txt]
"""

import docopt
import sys

def main(options):

    print("main")

    datamode            = options["--datamode"]
    filename_input_data = options["--data"]

    if datamode:
        print("engage data mode")
        process_data(filename_input_data)

    if not sys.stdin.isatty():
        print("accepting pipe data")
        input_stream = sys.stdin
        input_stream_list = [line for line in input_stream]
        print("input stream: {data}".format(data = input_stream_list))

def process_data(filename):

    print("process data of file {filename}".format(filename = filename))

if __name__ == "__main__":
    options = docopt.docopt(__doc__)
    if options["--version"]:
        print(version)
        exit()
    main(options)

Tags: inputdatastreamifmainversionsysexit
1条回答
网友
1楼 · 发布于 2024-06-16 10:13:56

就这样,你很好。在

除了[1]if __name__ == '__main__'as noted elsewhere之外,没有什么重要的

来自docs(重点矿):

A module’s __name__ is set equal to '__main__' when read from standard input, a script, or from an interactive prompt. A module can discover whether or not it is running in the main scope by checking its own __name__, which allows a common idiom for conditionally executing code in a module when it is run as a script or with python -m but not when it is imported

我也喜欢Python2的docs诗意地表达它

It is this environment in which the idiomatic “conditional script” stanza causes a script to run:

该保护程序保证只有在调用主函数时才会接受它下面的代码;将所有获取参数的代码放在那里。如果除了类/函数声明之外没有其他顶层代码,则可以安全地导入。在


其他并发症?在

是的:

  1. 多处理(启动一个新的解释器并重新导入)。if __name__ == '__main__'covers that
  2. 如果您习惯于使用C代码,您可能会认为可以使用ifdef等来保护您的导入。There's some analogous hacks in python, but it's not what you're looking for

我喜欢有一个main方法,比如C和Java——这是什么时候出现的?Never.


但我偏执!What if someone changes my main function。别再和那个人做朋友了。只要你是用户,我想这不是问题。在


我提到了-m标志。听起来不错,那是什么?!Here和{a9},但别担心。在


脚注

[1]好吧,你把你的主代码放在一个函数里是很好的。意味着事情会run slightly faster

相关问题 更多 >