程序调用:至少一个命令行参数

时间:2009-08-15 17:07:29

标签: python

我正在尝试检查此代码的用户是否只使用一个命令行参数(文件名)从命令行运行此程序。当我像这样运行这个代码时(我在Windows上)

C:\>python program.py
Usage: program.py <file.txt>
C:\>

右。但是当我使用我想操作的文件运行这个程序时,我什么都没打印出来:

C:\>python program.py file.txt

C:\>

问题出在哪里,我的代码就在这里

#!/Python26/
# -*- coding: utf-8 -*-

import sys

def main(argv):
    if len(argv) < 2:
        sys.stderr.write("Usage: %s <file.txt>" % (argv[0],))
        return 1

if __name__ == "__main__":
    sys.exit(main(sys.argv))

f = open(sys.argv[1])
lines = f.readlines()
f.close()

for line in lines:
    line = line.strip()
    etc...

6 个答案:

答案 0 :(得分:4)

您需要将f = open...及以后移动到主函数中。就目前而言,它永远不会被执行,因为执行在sys.exit调用结束。

[编辑]以这种方式构建模块是一种常见的Python习语,BTW。通过这种方式,文件可以包含可以由另一个模块导入的类和函数定义,并且它还可以包含代码,例如,仅当文件作为脚本直接运行时才执行的代码。

答案 1 :(得分:3)

我想你想要:

#!/Python26/
# -*- coding: utf-8 -*-

import sys

def main(argv):
    if len(argv) < 2:
        sys.stderr.write("Usage: %s <file.txt>" % (argv[0],))
        return 1

    f = open(sys.argv[1])
    lines = f.readlines()
    f.close()

    for line in lines:
        line = line.strip()
        etc...

if __name__ == "__main__":
    sys.exit(main(sys.argv))

答案 2 :(得分:2)

我注意到一个特殊的事实,即每个人的代码都建议你的main应该忽略它的参数(除了检查它已经足够了),然后直接回到sys.argv中。这真的很奇怪,我无法想象任何合情合理的事情 - 如果这个模块进口,难以测试,并且在明显的,简单的方式下没有任何优势,那么主要难以重用和令人惊讶这样做。

因此,我建议您对此进行编码的方式是:

import sys


def main(argv):

    if len(argv) < 2:
        sys.stderr.write("Usage: %s <file.txt>" % argv[0])
        return 1

    with open(argv[1]) as f:
        for line in f:
            line = line.strip()
            # etc, etc...

    return 0


if __name__ == "__main__":
    sys.exit(main(sys.argv))

您会注意到此变体中的一些建议更改 - 例如,我假设您正在使用Python的当前生产版本2.6,以便with语句可用(在2.5它需要一个from __future__ import)等等。但重点是,一个函数应该使用它的参数,而不是回到另一个模块,当它们已经被传递给它时再次抓住它们! - )

答案 3 :(得分:1)

import sys

def main(argv):
    if len(argv) < 2:
        sys.stderr.write("Usage: %s <file.txt>" % (argv[0],))
        return 1

    f = open(sys.argv[1])
    lines = f.readlines()
    f.close()

    for line in lines:
        line = line.strip()
        etc...

    return 0

if __name__ == "__main__":
    sys.exit(main(sys.argv))

答案 4 :(得分:0)

这是你的问题:

def main(argv):
    if len(argv) < 2:
        sys.stderr.write("Usage: %s <file.txt>" % (argv[0],))
        return 1
if __name__ == "__main__":
    sys.exit(main(sys.argv))

如果len(argv) < 2,您的main函数返回1,否则返回None。 <{1}}评估后没有任何内容。

作为一个小问题,如果它只是一个项目,则不需要将字符串格式化参数作为元组。这同样有效,如果不是更清楚一点:

if __name__ == "__main__"

答案 5 :(得分:0)

请注意,根据您的Python安装(您最初说过您使用的是Windows),命令行参数的编号可能会被关闭。由于编写可移植代码是一种很好的做法(无论您是否计划在其他地方运行它,迟早总是得到回报),我建议使用argparse模块,这让你在这里安全。通过使用它,您不必关心argv[0]实际上是否包含python.exe(例如,Windows上许多Python安装的情况)或脚本名称。此外,它还为呼叫者创建了适当的帮助信息等等。