Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python脚本和子流程之间切换pid?_Python_Python 2.7 - Fatal编程技术网

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

如何在python脚本和子流程之间切换pid?,python,python-2.7,Python,Python 2.7,我使用子流程启动应用程序,然后使用Python脚本分析输出。这个Python脚本是由我无法控制的第三方软件执行的。第三方软件测量CPU使用情况,它通过Python脚本测量CPU使用情况,而不是通过子流程启动的应用程序,这正是我实际需要的 事实证明,如果我使用bash的exec而不是subprocess启动应用程序,Python脚本的PID将与应用程序的PID相同,并且将测量应用程序的CPU使用率(这是我想要的)。但是,我将无法分析输出 我如何才能分析应用程序的输出,并让第三方软件测量应用程序(而

我使用子流程启动应用程序,然后使用Python脚本分析输出。这个Python脚本是由我无法控制的第三方软件执行的。第三方软件测量CPU使用情况,它通过Python脚本测量CPU使用情况,而不是通过子流程启动的应用程序,这正是我实际需要的

事实证明,如果我使用bash的
exec
而不是
subprocess
启动应用程序,Python脚本的PID将与应用程序的PID相同,并且将测量应用程序的CPU使用率(这是我想要的)。但是,我将无法分析输出

我如何才能分析应用程序的输出,并让第三方软件测量应用程序(而不是Python脚本)的CPU使用率? 我想我必须在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())

当执行另一个进程时,只需将stdout重定向到某个地方:

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(可调用,sentinel)。 例如,以
n
字节为单位读取文件:

for chunk in iter(lambda: file_object.read(n), ''):

我相信文档使用了蹩脚的
iter(f.readline.)
示例,因为它早于对文件的可移植支持,所以,在当时,这是逐行读取文件的最佳方式。

您可能无法像这样处理它(进程ID在大多数操作系统上是不可切换的)。然而,如果你说你正在使用的外部工具是什么,或者你需要什么样的分析输出,那么有人可能会帮助你找到解决方案。