我正在编写一个脚本来检查我系统上的python版本,我注意到python -V
写入错误流,而python -h
例如使用标准输出。这种行为有充分的理由吗?
答案 0 :(得分:3)
-h选项也用于打印到stderr,因为它不是程序输出的一部分,即输出不是由Python脚本生成的,而是由Python解释器本身生成的。
至于为什么他们改变-h使用stdout?尝试在终端窗口设置为标准24行的情况下键入python -h
。它滚出屏幕。
现在大多数人会通过尝试python -h |less
来做出反应,但这只有在将-h的输出发送到stdout而不是stderr时才有效。所以有一个很好的理由让-h去stdout,但没有理由改变-V。
答案 1 :(得分:2)
-h也用于打印到stderr,正如你在main.c中看到的那样。
usage(int exitcode, char* program)
{
fprintf(stderr, usage_line, program);
fprintf(stderr, usage_top);
fprintf(stderr, usage_mid);
fprintf(stderr, usage_bot, DELIM, DELIM, PYTHONHOMEHELP);
exit(exitcode);
/*NOTREACHED*/
}
...
if (help)
usage(0, argv[0]);
if (version) {
fprintf(stderr, "Python %s\n", PY_VERSION);
exit(0);
当前的main.c改变了用法的定义方式
usage(int exitcode, char* program)
{
FILE *f = exitcode ? stderr : stdout;
fprintf(f, usage_line, program);
if (exitcode)
fprintf(f, "Try `python -h' for more information.\n");
else {
fputs(usage_1, f);
fputs(usage_2, f);
fputs(usage_3, f);
fprintf(f, usage_4, DELIM);
fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
}
因此用法使用stdout表示-h和stderr表示-Q。
我无法看到任何证据表明良好的原因是另一种方式。可能在不破坏向后兼容性的情况下现在无法更改
答案 2 :(得分:2)
为什么?
因为它不是您实际脚本的实际输出。
这是标准错误的长期,标准,常见,典型,普通用途:一切都不是从脚本输出的。
答案 3 :(得分:1)
可能没有任何理由,一些挖掘显示the patch添加了选项,但我可以找到有关为什么在讨论补丁时使用不同流的原因。