python - 从 Python 2 返回的区别——版本检查和 Python 3

标签 python python-3.x batch-file cmd python-2.x

为什么在 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运算符 >>> 用于附加到一个文件;要(过度)写入,请改用 >

要将 STDOUTSTDERR 都写入文件,请使用这个(将 ?? 替换为 2734):

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 – 在 :

for /F "delims=" %V in ('C:\Python??\python.exe --version 2^>^&1') do set VAR=%V

中:

for /F "delims=" %%V in ('C:\Python??\python.exe --version 2^>^&1') do set VAR=%%V

注意 escaping使用 ^ 是避免过早尝试重定向所必需的。

要仅将纯版本号存储到前面没有单词 Python 的变量中,请将 delims= 替换为 tokens=2


让我们更进一步:你可以让 自行搜索所有可用的 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/

相关文章:

javascript - 通过验证用户身份使用 Django rest 框架下载文件

python - 使用 Python 在 Google 中搜索

python-3.x - 使用 PyInstaller 编译的 PyQt 看起来很奇怪(旧)- macOS

python : cannot import name JIRA

batch-file - 从msbuild或命令行调用signtool的“Invalid SHA1 hash format”错误

python - 查找包含字符串的元素的xpath

python - 使用 Keras 预训练 CNN 微调。如何卡住批归一化?

python - 如何使用facet创建条形图并使用seaborn添加标签

date - 从具有特定日期格式的批处理文件创建 txt 文件

batch-file - 从远程批处理文件刷新 Redis 数据库