微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Python 的 subprocess.Popen

如何解决从 Python 的 subprocess.Popen

我正在开展一个项目,该项目涉及使用 Gauge 和 Python 脚本运行系统级测试。不幸的是,由于我的项目的性质,我不能提供太多的细节和源代码,但我会尝试在我的问题中保留所有相关信息。我提前道歉。

作为我框架的一部分,我有一个“ProjectManager”类,它可以启动和关闭运行测试的模拟器。 “启动”函数基本上只是使用 subprocess.Popen 生成一个后台进程,它运行我们通常用来启动这个模拟器的 bash 脚本。这是一个快速的伪代码来说明这一点:

def startup(self):
    goScript = self.fetchLocationOfGoScript()
    goDir    = os.path.dirname(goScript)
    self.goScriptProcess = subprocess.Popen(goScript,cwd=goDir)

“go.sh”脚本与模拟器一起生成了许多服务。这是该脚本的快速代码

#!/bin/bash

terminate()
{
    kill ${EMULATOR_PID}
    kill ${SERVICE1_PID}
    kill ${SERVICE2_PID}
    ...
}

trap 'terminate' QUIT INT HUP TERM

/path/to/emulator --loglevel --url <url> run &
EMULATOR_PID=$!

/path/to/service1 --loglevel --url <url> run &
SERVICE1_PID=$!

/path/to/service2 --loglevel --url <url> run &
SERVICE2_PID=$!

...

while [1]
do
    sleep 1
done

terminate

go.sh 脚本本身在普通 bash shell 上运行良好,因此没有问题。类 ProjectManager() 也能够正确启动和关闭模拟器,所以同样没有问题。我遇到的问题与模拟器生成的日志和在 go.sh 脚本中运行的服务有关。在 bash shell 上运行时,日志显示正常。但是,当从 Python 运行时,日志中散布着大量的换行符,这使得阅读非常困难。这似乎尤其发生在日志量增加时(例如,在启动时)。以下是单行日志的示例:

EMULATOR(20
21-06-03
:
12:46:57)
N
e
w
o
b
j
e
c
t
r
e
f
e
r
e
n
c
e
cou
nt
wat
ermar
k
:
2

我尝试为 subprocess.Popen 调用使用各种可选参数。例如,我尝试使用 shell=True、bufsize=-1、bufsize=0、bufsize>1 等运行。我也尝试使用 subprocess.run 运行。似乎没有什么可以解决这个烦人的问题。我也不能过多地使用管道,因为用于测试的 Python 脚本(在生成 go.sh 脚本之后运行)经常使用 STDOUT 管道在运行命令后检索信息。

我希望我能够捕捉到足够多的相关信息。如果有人知道如何解决这个问题,请告诉我!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。