如何从STDOUT编辑字符串

时间:2016-10-16 09:11:56

标签: python subprocess netsh

我有这段代码:

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. \r\n\r\n'

如何获得这样的输出"成功托管网络停止了。"?

2 个答案:

答案 0 :(得分:2)

从子进程读取会为您提供 bytestring 。您可以解码此字节字符串(您必须找到合适的编码),或使用universal_newlines选项并让Python自动为您解码:

netshcmd = subprocess.Popen(
    'netsh wlan stop hostednetwork', 
    shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE,
    universal_newlines=True)

来自Frequently Used Arguments documentation section

  

如果 universal_newlines True,则这些文件对象将使用locale.getpreferredencoding(False)返回的编码以通用换行模式打开为文本流。对于stdin,输入中的行结束字符'\n'将转换为默认行分隔符os.linesep。对于stdoutstderr,输出中的所有行结尾都将转换为'\n'。有关更多信息,请参阅io.TextIOWrapper类的文档,当其构造函数的换行参数为None时。

对于通过shell运行的进程,locale.getpreferredencoding(False)应该正好使用正确的编解码器,因为它从与其他进程完全相同的位置获取有关使用的编码的信息像netsh那样应该咨询locale environment variables

使用universal_newlines=Trueoutput将设置为字符串'The hosted network stopped. \n\n'; note the newlines at the end. You may want to use str.strip()`以删除那里的额外空格:

print("Success", output.strip())

答案 1 :(得分:0)

这是一个字节串。更改您的代码以使其成为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())