何时解析 Python 脚本中的命令行
When to parse command line in a Python script
检查命令行参数的 sys.argv 应该在脚本的开头,在导入语句之后完成吗?
是否可以在脚本开头以外的任何地方检查命令行参数?我在 PEP8 中找不到它。
PEP8 是关于代码风格,而不是代码实现的算法。完全由您决定。
更常见的情况是,程序需要及早解析其命令行的结果,以便它知道该做什么。如果命令行包含日志记录选项,您可能需要尽快使用它,因为您需要尽快设置日志记录,例如,记录可能在任何地方发生的 任何未处理的异常 -- 否则您就赢了。我不知道它们 if当它们发生时!
这就是通常提前解析命令行的唯一原因。
是@ovunctuzel,sys.argv[=29=的使用point/location完全由你决定] 在你的 code/script.
Always perform input checks and validations at the beginning i.e. have validated inputs before moving forward/continue with the execution of latter parts of code. It will reduce the chance of crash.
sys.argv 是一个包含 命令行参数的列表 .
sys.argv[0] 是 python 源文件的名称,第一个 命令行参数 (必填)。
If your script deals with command line arguments and is based on these arguments then it's better to write the code at the beginning of script.
看看下面关于使用 sys 模块、sys.argv 列表等的重要链接。您可以除了异常处理之外,还可以基于此概念制作出色的应用程序。太棒了
References: http://www.pythonforbeginners.com/system/python-sys-argv
http://www.pythonforbeginners.com/argv/more-fun-with-sys-argv
根据一般经验,您需要解析 前面的所有参数。但是立即解析它们并不一定意味着立即处理它们,甚至验证它们。
当您只是使用 sys.argv
中的一堆字符串时, 没有解析,所以不会出现这种情况。但是非平凡的程序通常有标志,或数字参数,或命名的子命令等。如果你没有使用像 click
or cmd2
, you probably want to use argparse
这样的第三方库。然后区别就很明显了。
那么,您什么时候使用 参数?作为 ,您几乎需要尽快处理日志级别标志。但这并不适用于所有情况。考虑一个典型的 Unix 命令行工具,如 cat
:
$ cat file1 nonexistentfile file2
contents of file1
cat: nonexistentfile: No such file or directory
contents of file2
它没有验证所有三个文件并给我一个错误;它一个一个地尝试了这三个文件,在失败的文件上给我错误(到stderr
),并在没有失败的文件上输出(到stdout
)。这通常比预先验证所有文件有用得多。另一方面,cat -q
会因未知标志而预先失败。
在 Python 中,它看起来像:
import argparse
import sys
def cat(file, number):
with open(file) as f:
for num, line in enumerate(file):
if number: print(f'{num}', end=' ')
print(line)
if __name__ == '__main__'
parser = argparse.ArgumentParser()
parser.add_argument('filenames', metavar='file', nargs='+',
help='files to concatenate')
parser.add_argument('-n', '--number', action='store_true',
help='number the output lines')
for arg in args.filenames:
try:
cat(arg, args.number)
except Exception as e:
print(f'{prog}: {arg}: {e}', file=sys.std.stdout)
这是一个非常典型的组织——但它只是 "rule of thumb":
- 这是通常您想要做事的顺序。
- 程序的文本布局通常遵循它所做的顺序。
- 因此,您经常会以这种方式写东西。
如果您有充分的理由以不同的顺序做事,也许应该举个小旗子让您仔细检查您的理由。但是一旦你想通了,绝对违反经验法则。如果您有一些在查看参数之前总是值得做的处理,那么即使您使用 usage
消息退出也是有效的,那么就去做吧。 Python不会阻止你。
至于可读性:如果您正在做一些不寻常的事情,那么您的代码组织有点不寻常这一事实(如果有的话)对 reader.
检查命令行参数的 sys.argv 应该在脚本的开头,在导入语句之后完成吗?
是否可以在脚本开头以外的任何地方检查命令行参数?我在 PEP8 中找不到它。
PEP8 是关于代码风格,而不是代码实现的算法。完全由您决定。
更常见的情况是,程序需要及早解析其命令行的结果,以便它知道该做什么。如果命令行包含日志记录选项,您可能需要尽快使用它,因为您需要尽快设置日志记录,例如,记录可能在任何地方发生的 任何未处理的异常 -- 否则您就赢了。我不知道它们 if当它们发生时!
这就是通常提前解析命令行的唯一原因。
是@ovunctuzel,sys.argv[=29=的使用point/location完全由你决定] 在你的 code/script.
Always perform input checks and validations at the beginning i.e. have validated inputs before moving forward/continue with the execution of latter parts of code. It will reduce the chance of crash.
sys.argv 是一个包含 命令行参数的列表 .
sys.argv[0] 是 python 源文件的名称,第一个 命令行参数 (必填)。
If your script deals with command line arguments and is based on these arguments then it's better to write the code at the beginning of script.
看看下面关于使用 sys 模块、sys.argv 列表等的重要链接。您可以除了异常处理之外,还可以基于此概念制作出色的应用程序。太棒了
References: http://www.pythonforbeginners.com/system/python-sys-argv
http://www.pythonforbeginners.com/argv/more-fun-with-sys-argv
根据一般经验,您需要解析 前面的所有参数。但是立即解析它们并不一定意味着立即处理它们,甚至验证它们。
当您只是使用 sys.argv
中的一堆字符串时, 没有解析,所以不会出现这种情况。但是非平凡的程序通常有标志,或数字参数,或命名的子命令等。如果你没有使用像 click
or cmd2
, you probably want to use argparse
这样的第三方库。然后区别就很明显了。
那么,您什么时候使用 参数?作为 cat
:
$ cat file1 nonexistentfile file2
contents of file1
cat: nonexistentfile: No such file or directory
contents of file2
它没有验证所有三个文件并给我一个错误;它一个一个地尝试了这三个文件,在失败的文件上给我错误(到stderr
),并在没有失败的文件上输出(到stdout
)。这通常比预先验证所有文件有用得多。另一方面,cat -q
会因未知标志而预先失败。
在 Python 中,它看起来像:
import argparse
import sys
def cat(file, number):
with open(file) as f:
for num, line in enumerate(file):
if number: print(f'{num}', end=' ')
print(line)
if __name__ == '__main__'
parser = argparse.ArgumentParser()
parser.add_argument('filenames', metavar='file', nargs='+',
help='files to concatenate')
parser.add_argument('-n', '--number', action='store_true',
help='number the output lines')
for arg in args.filenames:
try:
cat(arg, args.number)
except Exception as e:
print(f'{prog}: {arg}: {e}', file=sys.std.stdout)
这是一个非常典型的组织——但它只是 "rule of thumb":
- 这是通常您想要做事的顺序。
- 程序的文本布局通常遵循它所做的顺序。
- 因此,您经常会以这种方式写东西。
如果您有充分的理由以不同的顺序做事,也许应该举个小旗子让您仔细检查您的理由。但是一旦你想通了,绝对违反经验法则。如果您有一些在查看参数之前总是值得做的处理,那么即使您使用 usage
消息退出也是有效的,那么就去做吧。 Python不会阻止你。
至于可读性:如果您正在做一些不寻常的事情,那么您的代码组织有点不寻常这一事实(如果有的话)对 reader.