python管道从错误的子进程获取输出

时间:2014-06-02 21:05:32

标签: python-3.x subprocess

我有一个用在linux下运行的python 3.2编写的应用程序,它大量使用了子进程模块和主题。其中一个功能是调用自定义脚本以获取各种特定于域的进程的up / down状态。由于我们有数百个,因此状态使用多个线程。该应用程序在"线程"中运行xmlrpc服务器。模式来处理传入的请求。

class AsyncXMLRPCServer(socketserver.ThreadingMixIn,SimpleXMLRPCServer) : pass

server = AsyncXMLRPCServer((LocalHost, 3200), requestHandler=RequestHandler, logRequests=False)
server.register_function( .... )
server.serve_forever()

最近我遇到了一个问题,即一个进程的输出被发送到两个进程。经过多次检查和记录后,似乎某种程度上是subprocess.PIPE得到了它的电线。问题总是发生在一对进程上,而不是同一对。

原始代码。每个线程都运行此

的副本
os.chdir(loc[1])
p = subprocess.Popen( cmd , stdout=subprocess.PIPE,stderr=subprocess.PIPE)
out,err = p.communicate()
out = out.decode('utf-8')
if err != None :
   err = err.decode('utf-8')

 logger.info('Output from %s WrapperScript.py', loc[1])
 logger.info(out)
 logger.info(err)
 .... followed by code to parse out and err to return results .....

当结果返回时,我看到ProcessA和ProcessB的文本是相同的,日志文件显示相同的内容。类似的事情:
2014-06-02 13:31:47,454 INFO:来自/ home / startup / ProcessOne WrapperScript.py的输出 2014-06-02 13:31:47,455信息:ProcessOne运行
2014-06-02 13:31:48,456 INFO:来自/ home / startup / ProcTwo WrapperScript.py的输出 2014-06-02 13:31:48,457信息:ProcessOne正在运行

使用常规python日志记录模块

生成日志文件
logger  = logging.getLogger()
handler = logging.handlers.RotatingFileHandler(logfile, maxBytes=1000000, backupCount=5)
logger.setLevel(logging.WARN)
formatter = logging.Formatter('%(asctime)s %(levelname)-7s: %(message)s')
handler.setFormatter(formatter)
logger.addHandler( handler )

所以我更新了#34; wrapperScript"将其输出写入本地文件系统。两个WrapperScript文件(存储在单独的文件夹中)都写入了正确的数据。所以这不是问题。

接下来我改变了Popen将stdout和stderr发送到tempfile:

os.chdir(loc[1])
tmpErr = open(loc[1]+os.sep+'err.txt', 'w+b')
tmpOut = open(loc[1]+os.sep+'out.txt', 'w+b')
p = subprocess.Popen( cmd , stdout=tmpOut, stderr=tmpErr)
out,err = p.communicate()

tmpOut.seek(0)
tmpErr.seek(0)
out = tmpOut.read().decode('utf-8')
err = tmpErr.read().decode('utf-8')

logger.info('Output from %s WrapperScript.py', loc[1])
logger.info(out)
logger.info(err)
tmpOut.close()
tmpErr.close()

这给了我相同的结果 - 2个随机进程总是共享相同的输出 从临时文件更改为与我的包装器脚本相同的文件夹中的常规文件无效。但与临时文件不同,我在线程完成后能够看到输出。结果是一样的。 2个输出文件具有相同的内容。

我该如何解决这个问题?或至少更接近问题所在?

0 个答案:

没有答案