我正在传递一个名为 FILE 的单个位置参数字符串,但是当没有传递任何参数时,我希望它打印一个用法语句。
每次我在命令行中编写"./files.py"并且后面没有参数时,我的代码什么也不做。我做错了什么?
import argparse
import re
#--------------------------------------------------
def get_args():
"""get arguments"""
parser = argparse.ArgumentParser(
description='Create Python script',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('FILE', help='Pass a file', type=str)
return parser.parse_args()
#--------------------------------------------------
def main():
"""main"""
args = get_args()
FILE = args.FILE.IGNORECASE()
if len(args) != 1:
print("Usage: files.py {}".format(FILE))
sys.exit(1)
# --------------------------------------------------
if __name__ == '__main__':
main()
预期成果:
$ ./files.py
Usage: files.py FILE
我得到的:
$./files.py
$
你从不跑main
...
import argparse
import re
#--------------------------------------------------
def get_args():
"""get arguments"""
parser = argparse.ArgumentParser(
description='Create Python script',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('FILE', help='Pass a file', type=str)
return parser.parse_args()
#--------------------------------------------------
def main():
"""main"""
args = get_args()
FILE = args.FILE.IGNORECASE()
if len(args) != 1:
print("Usage: files.py {}".format(FILE))
sys.exit(1)
main()
您需要定义代码的入口点。如果你想按照你所描述的(./files.py
(来调用它,你需要像这样定义主入口点:
if __name__ == "__main__":
"""main"""
args = get_args()
FILE = args.FILE.IGNORECASE()
if len(args) != 1:
print("Usage: files.py {}".format(FILE))
sys.exit(1)
你必须告诉你的操作系统,脚本必须由Python执行。添加 shebang 作为脚本的第一行:
#!/usr/bin/env python3
import argparse
...
否则,您必须使用 Python 显式执行脚本:
python3 ./files.py
必须调用 main
函数。一个好的地方是在脚本的末尾,保护仅在执行时运行:
if __name__ == '__main__': # do not run on import
main()
这给出了所需的输出:
$ python3 so_script.py
usage: so_script.py [-h] FILE
so_script.py: error: the following arguments are required: FILE
请注意,argparse
已经为您创建了用法和帮助消息。无需自己创建它们。事实上,argparse
会在运行您自己的使用情况信息之前结束您的脚本。
如果不想使用 -h
开关,请在创建参数分析器时传递add_help=False
。
parser = argparse.ArgumentParser(
description='Create Python script',
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
add_help=False,
)