从 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...