Python子进程-stderr在读取后擦除
我正在使用Python2.7,并试图检查stderr在执行的前10秒内是否返回了任何错误,如果没有,为了继续该过程,我不会等待该过程结束,因为它是一个循环 我得到了这个密码:Python子进程-stderr在读取后擦除,python,python-2.7,subprocess,popen,Python,Python 2.7,Subprocess,Popen,我正在使用Python2.7,并试图检查stderr在执行的前10秒内是否返回了任何错误,如果没有,为了继续该过程,我不会等待该过程结束,因为它是一个循环 我得到了这个密码: p = subprocess.Popen( ["python", os.getcwd() + "/start.py", 1hr, 30min, 0, 0], stdout=subprocess.PIPE, stderr=subprocess.PIPE) if
p = subprocess.Popen(
["python", os.getcwd() + "/start.py", 1hr, 30min, 0, 0],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if len(p.stderr.readlines()) is not None:
print p.stderr.readlines()
return jsonify(status="failed",
error_details=p.stderr.readlines()
)
问题是,在读取stderr的长度后,stderr会自动清除,因此我无法检查值并发布消息,因此打印p.stderr.readlines()将成为一个空列表
{
"error_details": [],
"status": "failed"
}
我不想显示输出,我只想运行
start.py
并检查错误,如果在10秒钟左右没有出现错误,这意味着一切都进行得很顺利,并且可以继续并在后台运行由子进程启动的循环,而无需检查它。如果p
进程在大约1小时后仍未能返回错误,我是否可以继续执行回调?我是否可以存储stderr,以便用消息进行回复?另外,您建议我如何在这10秒钟内制作一个计数器来检查是否出现错误?使用p.pool()
不会返回任何错误代码,即使文件不存在。当然,您可以存储读取行的结果,这样您就不会占用缓冲区,但您的代码有一个更严重的问题
对stdout
和stderr
使用subprocess.PIPE
,然后尝试读取stderr
,可能会导致死锁
此外,在某些情况下,进程可能会自动失败,并且在stderr
中不会写入任何内容。这不是获取返回代码的正确方法
唯一(也是更简单的)方法是使用通信:
p = subprocess.Popen(
["python", os.getcwd() + "/start.py", "1hr", "30min", "0", "0"],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out,err = p.communicate()
rc = p.wait()
if rc: # non-zero return code
return jsonify(status="failed",
error_details=err.decode().splitlines())
您可以在两个单独的线程中透明地读取输出和错误(不可能出现死锁),并测试返回代码。如果不是零,则发生错误。分割解码器错误输出(Python3)的行并返回错误
请注意,splitlines()
删除流上的行终止(与readlines()
相反)
上述方法无法处理“等待10秒,然后测试错误输出”方法。这可能:
p = subprocess.Popen(
["python", os.getcwd() + "/start.py", "1hr", "30min", "0", "0"],
stdout=subprocess.DEVNULL, # don't read stdout, avoids deadlock
# stdout=devnull, # python 2, where devnull = open(os.devnull, 'w')
stderr=subprocess.PIPE)
# now wait 10 seconds
time.sleep(10)
if p.poll() is not None and p.poll() != 0:
return jsonify(status="failed",
error_details=p.stderr.readlines() # add .decode() for python 3
)
上述方法等待10秒,然后测试进程是否以错误结束,返回错误/读取错误输出。当然,您可以存储读取行的结果,这样您就不会占用缓冲区,但您的代码有一个更严重的问题
对stdout
和stderr
使用subprocess.PIPE
,然后尝试读取stderr
,可能会导致死锁
此外,在某些情况下,进程可能会自动失败,并且在stderr
中不会写入任何内容。这不是获取返回代码的正确方法
唯一(也是更简单的)方法是使用通信:
p = subprocess.Popen(
["python", os.getcwd() + "/start.py", "1hr", "30min", "0", "0"],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out,err = p.communicate()
rc = p.wait()
if rc: # non-zero return code
return jsonify(status="failed",
error_details=err.decode().splitlines())
在两个单独的线程中透明地读取输出和错误(不可能出现死锁),并测试返回代码。如果不是零,则发生错误。拆分解码器错误输出(python 3)的行并返回错误
请注意,splitlines()
删除流上的行终止(与readlines()
相反)
上述方法无法处理“等待10秒,然后测试错误输出”方法。这可能:
p = subprocess.Popen(
["python", os.getcwd() + "/start.py", "1hr", "30min", "0", "0"],
stdout=subprocess.DEVNULL, # don't read stdout, avoids deadlock
# stdout=devnull, # python 2, where devnull = open(os.devnull, 'w')
stderr=subprocess.PIPE)
# now wait 10 seconds
time.sleep(10)
if p.poll() is not None and p.poll() != 0:
return jsonify(status="failed",
error_details=p.stderr.readlines() # add .decode() for python 3
)
上述方法等待10秒,然后测试进程是否以错误结束,返回错误/读取错误输出。非常感谢,我在谷歌上搜索了2天,没有结果。我使用的方法是在10秒后检查错误,我只需编辑stdout=subprocess.DEVNULL
到stdout=DEVNULL
和adddevnull=open(os.devnull,'w')
。非常感谢,我在谷歌上搜索了两天没有结果。我使用的方法是在10秒后检查错误,我只需编辑stdout=subprocess.devnull
到stdout=devnull
并添加devnull=open(os.devnull,'w')
。