我正在尝试将 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/