subprocess.Popen和ipython - python

(在Ubuntu 16.04上使用python3.4)

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

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

subprocess.Popen("MyProcess")

之后,我拖了一个文件-

! tail -f a_log

然后,按Control + c退出尾部。

结果是MyProcess也停止了。

当有多个进程在运行时,我看到了这一点;它们全部被杀死。

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

参考方案

您需要了解的第一件事是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进程组,则该组中的所有进程都会接收到该信号并相应地退出。

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

Subprocess.Popen标准输出,等待程序完成 - python

我正在通过subprocess.Popen运行程序,遇到一个意外问题,其中stdout不能实时打印,而是等待程序完成。奇怪的是,这仅在使用Python编写被调用程序时发生。我的控制程序(一个使用子过程的程序)如下:import subprocess import os print("Warming up") pop = subproces…

如何从基本的Python脚本中生成新的Shell来运行Python脚本? - python

我已经成功运行了几个Python脚本,并使用subprocess模块​​从基本脚本中调用了它们:subprocess.popen([sys.executable, 'script.py'], shell=True) 但是,每个脚本都执行一些模拟(来自C++应用程序的.exe文件),这些模拟会生成一些输出到外壳程序。所有这些输出都从我启动这…

阻塞和非阻塞子流程调用 - python

我对subprocess.call(),subprocess.Popen()和subprocess.check_call()完全感到困惑。哪个是阻塞的,哪个不是?我的意思是说,如果我使用subprocess.Popen(),则父进程是否在继续执行之前先等待子进程return / exit。shell=True如何影响这些调用? 参考方案 Popen是非阻塞的…

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python:图像处理可产生皱纹纸效果 - python

也许很难描述我的问题。我正在寻找Python中的算法,以在带有某些文本的白色图像上创建皱纹纸效果。我的第一个尝试是在带有文字的图像上添加一些真实的皱纹纸图像(具有透明度)。看起来不错,但副作用是文本没有真正起皱。所以我正在寻找更好的解决方案,有什么想法吗?谢谢 参考方案 除了使用透明性之外,假设您有两张相同尺寸的图像,一张在皱纹纸上明亮,一张在白色背景上有深…