我有这样的代码:
netshcmd = subprocess.Popen('netsh wlan stop hostednetwork', shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
output, errors = netshcmd.communicate()
if errors:
print("Warrning: ", errors)
else:
print("Success", output)
,输出如下:
Success b'The hosted network stopped. rnrn'
如何得到这样的输出"Success The hosted network stopped."?
从子进程读取给你一个字节字符串。你可以解码这个字节串(你必须找到一个合适的编码),或者使用universal_newlines
选项,让Python自动为你解码:
netshcmd = subprocess.Popen(
'netsh wlan stop hostednetwork',
shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE,
universal_newlines=True)
来自常用参数文档部分:
如果universal_newlines是
True
,这些文件对象将使用locale.getpreferredencoding(False)
返回的编码以通用换行模式作为文本流打开。对于stdin
,输入中的行结束字符'n'
将被转换为默认的行分隔符os.linesep
。对于stdout
和stderr
,输出中的所有行尾都将转换为'n'
。有关更多信息,请参阅io.TextIOWrapper
类的文档,当其构造函数的newline参数为None
时。
对于一个通过shell运行的进程,locale.getpreferredencoding(False)
应该是完全正确的编解码器,因为它从其他进程(如netsh
)应该参考的相同位置获取关于使用什么编码的信息,区域环境变量。
对于universal_newlines=True
, output
将设置为字符串'The hosted network stopped. nn'; note the newlines at the end. You may want to use
str.strip() ',以删除那里的额外空白:
print("Success", output.strip())
这是一个字节串。修改代码使其成为str:
netshcmd = subprocess.Popen('netsh wlan stop hostednetwork', shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
output, errors = netshcmd.communicate()
if errors:
print("Warrning: ", errors.decode())
else:
print("Success", output.decode())