我正在使用子进程启动应用程序,然后使用Python脚本分析输出。这个Python脚本由我无法控制的第三方软件执行。第三方软件测量CPU使用率,它测量Python脚本的CPU使用率,而不是我通过子进程启动的应用程序,这是我实际需要的。
事实证明,如果我使用例如bash的exec
而不是subprocess
,Python脚本的PID将与应用程序的PID相同,并且将测量应用程序的CPU使用率(这就是我想要的)。但是,那时我将无法分析输出。
如何分析应用程序的输出并使第三方软件测量应用程序的CPU使用率(而不是Python脚本)? 我想我必须以某种方式在Python脚本和子进程之间切换PID。可以这样做吗? 还有其他想法可以解决这个问题吗?
这是在CentOS 6和Windows 7上使用Python 2.7。
这是我到目前为止所做的:
import sys, os, subprocess
# Command
command = [Render, '/path/to/file']
# Launch subprocess
p = subprocess.Popen( command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT )
# PIDs
script_pid = os.getpid()
app_pid = p.pid
# Analyze the app's output
for line in iter(p.stdout.readline, b''):
sys.stdout.flush()
print(">>> " + line.rstrip())
答案 0 :(得分:0)
只需将stdout
重定向到exec
其他进程时的内容:
import io
import sys
sys.stdout = io.StringIO() # or BytesIO
exec the_command
output = sys.stdout.getvalue()
sys.stdout = sys.__stdout__
顺便说一句,您对iter
的使用毫无用处。这样做的:
for line in iter(file_object.readline, ''):
与完全相同:
for line in file_object:
除了:
当您需要不同类型的迭代时,应该使用iter(callable, sentinel)
。
例如,以n
字节:
for chunk in iter(lambda: file_object.read(n), ''):
我认为文档使用了蹩脚的iter(f.readline, '')
示例,因为它早于对文件的可迭代支持,因此,当时,这是逐行读取文件的最佳方式