为什么'python --version'不能打印字符串

Hao*_*Yin 4 python bash

我试图编写一个bash脚本来测试python版本.但是,我发现python --versionpython 2表现得很奇怪,因为我无法使用任何工具处理它的输出.我在Mac OS(10.13.5)和AWS Linux(GUN/Linux#1 SMP Fri Feb 16 00:18:48 UTC 2018)上测试了相同的脚本.所以我认为这个问题与python 2有关.

脚本和相应的输出是:

$ echo $(python --version) | awk '{print $2}'
> Python 2.7.10
Run Code Online (Sandbox Code Playgroud)

但输出应该是2.7.10.

$ echo $(python --version) > weird.txt
> Python 2.7.10
$ cat weird.txt
>
Run Code Online (Sandbox Code Playgroud)

因此输出也不能写入文件.

测试python3的相同脚本有一个完全不同的结果

$ echo $(python3 --version) | awk '{print $2}'
> 3.6.5
Run Code Online (Sandbox Code Playgroud)

但python3的输出可以写入文件.

$ echo $(python3 --version) > weird.txt
$ cat weird.txt
> Python 3.6.5
Run Code Online (Sandbox Code Playgroud)

我发现这种差异的原因是python --version不输出正常的字符串或任何东西.也许它调用另一个命令来输出结果??? 因此结果不能被当前的过程捕获?(这里只是猜测)

任何人都可以帮我弄清楚为什么这里有区别?可能有百万种方法来测试python版本.但我对这里发生的事情非常好奇.

感谢所有的答复.刚刚找到一个有用的答案解释为什么python -V输出到stderr: 为什么python打印版本信息到stderr?

Ilj*_*ilä 8

Python的输出版本标准错误(错误)根据高达3.3版本发行18338和注意这里,所以相应地重定向:

$ echo $(python --version 2>&1) | awk '{print $2}'
2.7.14
Run Code Online (Sandbox Code Playgroud)

命令替换是不必要的,这可以写成:

$ python --version 2>&1 | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

  • 你不需要这里的`echo`,只需要`python --version 2>&1 | awk'{print $ 2}'` (3认同)