我正在尝试将 powershell 的输出存储在 var 中:

import subprocess
subprocess.check_call("powershell \"Get-ChildItem -LiteralPath 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall' -ErrorAction 'Stop' -ErrorVariable '+ErrorUninstallKeyPath'\"", shell=True, stderr=subprocess.STDOUT)

这样,使用 check_call ,它打印正常,例如:

显示名称:Skype™

但这样它只能打印到屏幕上,所以我必须使用
import subprocess
output = subprocess.check_output("powershell \"Get-ChildItem -LiteralPath 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall' -ErrorAction 'Stop' -ErrorVariable '+ErrorUninstallKeyPath'\"", shell=True, stderr=subprocess.STDOUT)

但是,使用 check_output ,我得到:

显示名称:SkypeT

我该如何解决这个问题?

最佳答案

输出是 bytes 类型,因此您需要使用 .decode('utf-8') (或您想要的任何编解码器)将其解码为字符串,或者使用 str() ,例如:

import subprocess
output_bytes = subprocess.check_output("powershell \"Get-ChildItem -LiteralPath 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall' -ErrorAction 'Stop' -ErrorVariable '+ErrorUninstallKeyPath'\"", shell=True, stderr=subprocess.STDOUT)

output_string = str(output_bytes)
# alternatively
# output_string = output_bytes.decode('utf-8')

# there are lots of \r\n in the output I encounterd, so you can split
# to get a list
output_list = output_string.split(r'\r\n')

# once you have a list, you can loop thru and print (or whatever you want)
for e in output_list:
    print(e)

这里的关键是解码为您想要使用的任何编解码器,以便在打印时生成正确的字符。

关于python子进程编码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49150550/

10-12 18:20