所以你可能会做一些类似的事情:
#!python
from __future__ import print_function
# Your code here
# ...
#
if __name__ == '__main__':
import sys
top=500
if len(sys.argv) < 2:
print ("Must supply a list of files to operate on", file=sys.stderr)
## For Python versions older than 2.7 use print >> sys.stderr, "..."
sys.exit(1)
for each in sys.argv[1:]:
main(each, top)
请注意,我展示了一种包装现有函数的简单方法,以便您可以使用任意数量的文件名参数调用程序。如果你愿意,你也可以只使用一个指向目录的参数(你想要处理所有文件的目录:
#!python
from __future__ import print_function
# Your code here
# ...
#
if __name__ == '__main__':
import sys
top = 500
if len(sys.argv) != 2:
## Require exactly one argument: sys.argv[0] is our own executable filename
## (Similarly to how class methods are called with "self" as their first
## argument, but on the OS layer)
print ("Must supply directory name full of files to be processed", file=sys.stderr)
sys.exit(1)
for each in os.listdir(sys.argv[1]):
main(each, top)
您可以选择许多其他方式来处理您的参数、硬编码默认参数等。我将让您想象如何将“top”从硬编码值更改为命令行参数。为了获得额外的功劳,使用 option/arg 解析模块( argparse或optparse )使其成为具有默认值的命令行开关。
请注意,此if __name__ == ....
业务是 Python 约定,它通过鼓励您将功能与操作分开来促进良好的编程实践。因此,您的所有功能都可以在该if __name__ == '__main__':
行之上定义,并且您的脚本执行的所有操作(使用该功能)都可以在它之后调用。这允许您的文件被其他程序用作模块,同时仍然允许它拥有自己的实用程序作为自己的程序。(这是一个几乎是 Python 独有的特性,尽管 Ruby 实现了一组相似的语义,但语法略有不同)。
这些__future__
东西允许您使用 Python 2.7 编写程序,该程序使用print
与 Python 3.x 兼容的语义。这对于最终过渡到 Python 3 以及讨论该语言很有用,因此我们可以逐步淘汰旧的“print”作为语句并促进“print()”函数的使用。如果您不关心细节,请不要担心。只要意识到差异是普遍存在的,必须大多是次要的。您将看到的绝大多数示例都使用旧的打印语义,并且您将希望使用更新的、稍微不兼容的语义。
(注意:在我最初的帖子中,我from __future__ import
在该__main__
部分中有。特别是那行不通(并且通常 Python__future__
导入应该在任何其他代码之前发生)。[我基本上是在试图传达这个想法并且不想要陷入 Python2.x 和 Python3 打印语义之间的差异。