我正在考虑如何使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)
就这样,你很好。在
除了
[1]
,if __name__ == '__main__'
,as noted elsewhere之外,没有什么重要的来自docs(重点矿):
我也喜欢Python2的docs诗意地表达它
该保护程序保证只有在调用主函数时才会接受它下面的代码;将所有获取参数的代码放在那里。如果除了类/函数声明之外没有其他顶层代码,则可以安全地导入。在
其他并发症?在
是的:
if __name__ == '__main__'
covers thatifdef
等来保护您的导入。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相关问题 更多 >
编程相关推荐