为什么在 Python 2 上运行 --version
检查的返回结果与在 Python 3 上的表现不同?下面是将输出写入文本文件并随后检查该文件内容时的两种行为的示例。
C:\Users\user1>C:\Python27\python.exe --version >> file2.txt
Python 2.7.13
C:\Users\user1>type file2.txt
C:\Users\user1>C:\Python38\python.exe --version >> file3.txt
C:\Users\user1>type file3.txt
Python 3.8.1
C:\Users\user1>
有什么方法可以产生与 Python 3 相同的行为吗?我想将 --version
检查命令的输出用作批处理文件的一部分,以确保使用正确的版本来执行脚本。
最佳答案
Python 2 似乎将版本信息输出到 STDERR(句柄 2
)而不是 STDOUT(句柄 1
), 所以改变:
C:\Python27\python.exe --version >> file2.txt
到:
C:\Python27\python.exe --version 2> file2.txt
redirection运算符 >>>
用于附加到一个文件;要(过度)写入,请改用 >
。
要将 STDOUT 和 STDERR 都写入文件,请使用这个(将 ??
替换为 27
或34
):
C:\Python??\python.exe --version > "file.txt" 2>&1
表达式 2>&1
表示将句柄 2
重定向到句柄 1
的当前目标,这是给定的文本文件,因为>“文件.txt”
。请注意,>
等同于 1>
,因为输出重定向的默认句柄是 1
(STDOUT)。此处的顺序很重要(因此 2>&1 > "file.txt"
会失败)。
这在附加到文件时也有效:
C:\Python??\python.exe --version >> "file.txt" 2>&1
要在没有(临时)文件的情况下将结果直接放入变量中,请使用 for /F
loop – 在 cmd :
for /F "delims=" %V in ('C:\Python??\python.exe --version 2^>^&1') do set VAR=%V
在 batch-file 中:
for /F "delims=" %%V in ('C:\Python??\python.exe --version 2^>^&1') do set VAR=%%V
注意 escaping使用 ^
是避免过早尝试重定向所必需的。
要仅将纯版本号存储到前面没有单词 Python
的变量中,请将 delims=
替换为 tokens=2
。
让我们更进一步:你可以让 batch-file自行搜索所有可用的 Python 版本。假定包含 python.exe
的目录路径列在 system variable PATH
中, 你可以使用 where
获取可执行文件的完整路径,然后让 for/F
循环遍历它们以获取它们的确切版本(版本号只是为了演示而在此处回显):
@echo off
for /F "delims=" %%W in ('where python') do (
for /F "tokens=2" %%V in ('"%%W" --version 2^>^&1') do (
echo %%V
)
)
如果 PATH
变量不包含路径,您也可以使用 for /D
搜索所有路径 C:\Python??
(这里 ??
的字面意思是 wildcards ); where
只是检查是否确实有一个文件 python.exe
:
@echo off
for /D %%X in ("%SystemDrive%\Python??") do (
for /F "delims=" %%W in ('where "%%~X":python 2^> nul') do (
for /F "tokens=2" %%V in ('"%%W" --version 2^>^&1') do (
echo %%V
)
)
)
关于python - 从 Python 2 返回的区别——版本检查和 Python 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62215521/