python子进程Popen挂起

2024-05-28 19:40:22 发布

您现在位置:Python中文网/ 问答频道 /正文

OpenSolaris derivate (NexentaStor), python 2.5.5

我看到了很多例子,很多似乎表明问题是一个死锁。我没有写stdin,所以我认为问题是其中一个shell命令过早退出。在

在波本执行的是:

^{pr2}$

换句话说,登录到远程主机并(发送一个存储卷的复制流,通过管道将其发送到gzip)将其发送到zfs recv以写入本地数据存储。在

我已经看到了关于缓冲区的解释,但是我绝对没有填满那些缓冲区,而且gzip过早地退出了,所以我认为进程。等等()永远没有出口。在

process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
process.wait()
if process.returncode == 0:
    for line in process.stdout:
        stdout_arr.append([line])
    return stdout_arr
else:
    return False

下面是我运行并中断它时发生的情况

# ./zfs_replication.py 
gzip: stdout: Broken pipe

^CKilled by signal 2.
Traceback (most recent call last):
  File "./zfs_replication.py", line 155, in <module>
   Exec(zfsSendRecv(dataset, today), LOCAL)
  File "./zfs_replication.py", line 83, in Exec
    process.wait()
  File "/usr/lib/python2.5/subprocess.py", line 1184, in wait
    pid, sts = self._waitpid_no_intr(self.pid, 0)
  File "/usr/lib/python2.5/subprocess.py", line 1014, in _waitpid_no_intr
    return os.waitpid(pid, options)
keyboardInterrupt

我也试着用通讯通讯()方法,但如果gzip退出,这个方法也会挂起。在这种情况下,我的命令的最后一部分(zfs recv)退出,因为本地数据集已被修改,因此增量复制流将不会被应用,所以即使这将被修复,也必须有一种方法来处理gzip断开的管道?在

process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
stdout, stderr = process.communicate()

if process.returncode == 0:
    dosomething()
else:
    dosomethingelse()

跑步时:

cannot receive incremental stream: destination tank/repl_test has been modified

since most recent snapshot
gzip: stdout: Broken pipe

^CKilled by signal 2.Traceback (most recent call last):

  File "./zfs_replication.py", line 154, in <module>
    Exec(zfsSendRecv(dataset, today), LOCAL)
  File "./zfs_replication.py", line 83, in Exec
    stdout, stderr = process.communicate()
  File "/usr/lib/python2.5/subprocess.py", line 662, in communicate
    stdout = self._fo_read_no_intr(self.stdout)
  File "/usr/lib/python2.5/subprocess.py", line 1025, in _fo_read_no_intr
    return obj.read()
KeyboardInterrupt

Tags: inpyselfreturnlibusrstdoutline

热门问题