Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.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

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子进程-stderr在读取后擦除_Python_Python 2.7_Subprocess_Popen - Fatal编程技术网

Python子进程-stderr在读取后擦除

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

我正在使用Python2.7,并试图检查stderr在执行的前10秒内是否返回了任何错误,如果没有,为了继续该过程,我不会等待该过程结束,因为它是一个循环

我得到了这个密码:

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
和add
devnull=open(os.devnull,'w')
。非常感谢,我在谷歌上搜索了两天没有结果。我使用的方法是在10秒后检查错误,我只需编辑
stdout=subprocess.devnull
stdout=devnull
并添加
devnull=open(os.devnull,'w')