subprocess.Popen和ipython

时间:2018-10-14 19:12:54

标签: python ipython python-3.4

(在Ubuntu 16.04上使用python3.4)

我试图了解我的行为是否是功能或其他原因。

我正在启动一个ipython shell,并正在启动一个进程-

subprocess.Popen("MyProcess")

在那之后,我拖了一个文件-

! tail -f a_log

然后,我按Control + c退出尾巴。

结果是MyProcess也停止了。

当有多个正在运行的进程=它们都被杀死时,我看到了这一点。

还尝试将stdout和stderr重定向到subprocess.DEVNULL,但这没有帮助。

3 个答案:

答案 0 :(得分:0)

我相信这是CTRL C所做的

答案 1 :(得分:0)

您需要了解的第一件事是ctrl + c会将signal发送到前任任务的进程组。您需要知道的第二件事是进程组包括您的Python进程及其开放的子进程。

例如,我将使用4行脚本在没有iPython的情况下重新创建您的实验:

import subprocess, os

pipe1 = subprocess.Popen('sleep 500', shell=True)
pipe2 = subprocess.Popen('sleep 500', shell=True)
pipe3 = subprocess.Popen('tail -f /var/log/syslog', shell=True).wait()

如您所见,这将打开两个通往sleep的管道(在500秒内不执行任何操作)和一个通往tail的管道,并跟随/var/log/syslog

现在,在运行的同时,我要在另一个终端中输入ps ax -O tpgid,并查看我正在运行的进程,包括其组ID

24083 24083 S pts/9    00:00:00 python3 foo.py
24084 24083 S pts/9    00:00:00 /bin/sh -c sleep 500
24085 24083 S pts/9    00:00:00 sleep 500
24086 24083 S pts/9    00:00:00 /bin/sh -c sleep 500
24087 24083 S pts/9    00:00:00 sleep 500
24088 24083 S pts/9    00:00:00 /bin/sh -c tail -f /var/log/syslog
24089 24083 S pts/9    00:00:00 tail -f /var/log/syslog

第一列是进程ID,第二列是组ID,这很重要。

如果我运行kill -INT 24083,它将INT(中断)信号发送到24083 进程组,则该组中的所有进程都会接收到该信号并相应地退出。 / p>

当您按ctrl + c时,这就是您正在发生的事情。进程组接收到信号,并且每个进程都将按照POSIX标准退出。

答案 2 :(得分:0)

我找到了一种方法:

import os
def myspawn():
    os.setsid()
    path = os.environ["PATH"] + ":/home/another/path"
    env = {"PATH": path}
    os.execlpe("program.sh", env)

def myFunc():
    pid = os.fork()
    if (pid == 0):
        print("In child")
        myspawn()
    else:
        print("in father")
        return

myFunc()
相关问题