process = subprocess.Popen(["ls", "-lart"],
bufsize=-1, # fully buffered (default)
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
cwd=os.curdir,
env=os.environ)
my_stdout_file = open("stdout.txt", "w")
while True:
process.poll()
line = process.stdout.readline()
my_stdout_file.write(line)
eline = process.stderr.readline()
if line:
stdout_lines.append(line)
if eline:
stderr_lines.append(eline)
if (line == "" and eline == "" and
process.returncode != None):
break
我想我可以共享一个不使用.poll()、.wait()或.communicate()的解决方案。几点:
import codecs
,因为我的输出包含东亚UTF-8文本try:
捕获每一行,以筛选出损坏/无效的UTF-8文本'\x0a'
强制Linux换行,而不考虑平台。for line in iter(subproc.stderr.readline, ''):
代码:
您可以使用poll与流程交互,以便尝试逐行与之交互:
例如:
是的,这是可能的。下面是我为一个测试工具编写的一个函数,用于对Python shell脚本进行单元测试。
函数返回一个元组,该元组包含由
sys.exit()
发出的shell返回代码、标准输出文本和标准错误输出文本。它们都是文本字符串,因此在处理之前需要使用splitlines
将它们分成几行。如果您真的需要逐行与输出交互,那么最好使用pexpect,而不是
subprocess
模块。相关问题 更多 >
编程相关推荐