第一篇文章,也是第一次尝试编写超过99瓶的东西......
我正在处理从cli接受参数的代码,例如文本文件。预期用途是:
$:myfile.py input.txt
我已经顺利地完成了这个方面但是如果没有提供参数,cli会返回错误,我想提供一些错误响应,例如帮助列表或只是简单的&#34 ;不 - 给我一个文件"
现在这是前几行:
import sys
with open(sys.argv[1], 'r') as f:
ifile = f.read()
if len(sys.argv) == 1:
empty = "Please give me something to do!"
print empty
如果我提供了预期的参数,一切都很好,但如果没有提供参数,我得到这个:
Traceback (most recent call last):
File "myfile.py", line 3, in <module>
with open(sys.argv[1], 'r') as f:
IndexError: list index out of range
让我们说我只想要变量&#34;空&#34;如果条件未满足则打印...我该怎么做才能解决这个问题。
编辑:在使用argparse尝试下面的建议之后我得到了更好的结果但是我注意到argparse投掷了一个我没想到的角色。代码现在是:
def main(filename):
# do something with filename
print('your filename is %s' % filename)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='my program help')
parser.add_argument('-f', help='specify file path')
当我运行这个时,我希望看到-h和-f作为选项,但我在说明中看到了额外的F.
my program help
optional arguments:
-h, --help show this help message and exit
-f F specify macro file path
你能告诉我如何摆脱这个额外的F.我已经尝试过一些东西但是它出现了,或者当我运行它时会出错。
答案 0 :(得分:3)
使用argparse
解析cli输入参数:
您案例的示例代码:
import argparse
def main(filename):
# do something with filename
print('your filename is %s' % filename)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='my program help')
parser.add_argument('filename', help='your desired filename')
args = parser.parse_args()
main(args.filename)
从没有参数的终端运行我们得到:
$ python ans_argparse.py
usage: ans_argparse.py [-h] filename
ans_argparse.py: error: the following arguments are required: filename
使用参数运行:
$ python ans_argparse.py 'myfile.txt'
your filename is 'myfile.txt'
创建自定义解析器可能需要时间,而不是那么直接。
argparse
具有许多功能,并且嵌入在stdlib中,因此更喜欢使用它。
我通常创建parse_args()
函数,因此测试它或在__main__
之外调用它更容易:
import sys
import argparse
def main(filename):
# do something with filename
print('your filename is %s' % filename)
def parse_args(args_lst):
parser = argparse.ArgumentParser(description='my program help')
parser.add_argument('filename', help='your desired filename')
return parser.parse_args(args_lst)
if __name__ == '__main__':
args = parse_args(sys.argv[1:])
main(args.filename)
你可以这样称呼它:
args = parse_args(['another_filename.txt'])
使用metavar
可选参数更改帮助中变量的显示名称。我鼓励您阅读argparse
的文档以获取更多示例和用例
parser.add_argument('-f', metavar='FILENAME', required=True,
help='the file path for this program')
python myprog.py --help
的输出:
optional arguments:
-h, --help show this help message and exit
-f FILENAME the file path for this program
注意:不要忘记required=True
参数,这样您就会收到来自argparse
的错误消息。
答案 1 :(得分:0)
你需要在使用它之前检查sys.argv的正确性,如果你之后显然已经很晚了。
像这样的例子
import sys
if len(sys.argv)>1:
#do something
else:
print "Please give me something to do!"
答案 2 :(得分:0)
argparse
很棒,但你也可以保持简单
import sys
if len(sys.argv) != 2:
sys.stderr.write("Usage: myfile.py textfile\n")
exit(1)
with open(sys.argv[1], 'r') as f:
pass # ...