我正在尝试检查此代码的用户是否只使用一个命令行参数(文件名)从命令行运行此程序。当我像这样运行这个代码时(我在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...
答案 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安装的情况)或脚本名称。此外,它还为呼叫者创建了适当的帮助信息等等。