如何从STDOUT编辑字符串



我有这样的代码:

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_newlinesTrue,这些文件对象将使用locale.getpreferredencoding(False)返回的编码以通用换行模式作为文本流打开。对于stdin,输入中的行结束字符'n'将被转换为默认的行分隔符os.linesep。对于stdoutstderr,输出中的所有行尾都将转换为'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())

相关内容

  • 没有找到相关文章

最新更新