如何在python脚本和子进程之间切换pid?

时间:2014-09-09 08:34:26

标签: python python-2.7

我正在使用子进程启动应用程序,然后使用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())

1 个答案:

答案 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, '')示例,因为它早于对文件的可迭代支持,因此,当时,这是逐行读取文件的最佳方式