微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有shell = True的python子进程:重定向和与平台无关的子进程终止

我很难从python子进程模块中得到我想要的东西(它应该是一个统一的/独立于平台的抽象,afaik,但是不要让我开始那个:)).

所以我所追求的简单事情如下.我想要

>启动外部(stdio)应用程序(可能使用子进程),我使用shell样式重定向(如’./myapp> stdout_log> stderr_log’)

>基本上我想执行一个shell命令行,所以我必须为subprocess.Popen()指定shell = True(否则命令行中的重定向将不起作用)

>我想以异步方式启动此命令行(因此它作为一个独立的子进程运行,但我的python进程不会等待它的完成)
>(我的父python进程会不时查看子进程的日志以提取信息,但这与问题无关)
>如果我的父python进程决定,它应该能够终止这个子进程.

现在,我的主要问题是

>我基本上被迫使用shell = True,以使重定向工作
>在父python进程中处理子进程的stdout / stderr不是一个选项,因为我找不到以非等待方式执行它的功能(并且父进程必须做其他事情)
>如果我使用shell = True,那么subprocess.kill()将只终止shell而不是子进程
>我需要一个可靠的子进程终止方法,适用于任何平台(但至少Linux和Windows)

我希望我足够具体.感谢任何提示/提示 – 我只花了一整天的子流程,恕我直言,这是一个远离平台独立或简单的痛苦:((但也许只是我)

更新(2010-10-13):

如果你启动一个子进程(即使shell = False),那么subprocess.Popen.kill()函数只会杀死那个子进程(所以如果有任何“孙子”进程,它们将不会被终止. )

我读到了使用preexec_fn参数在所有子进程上设置sid,但它只是unix:timeout a subprocess

最佳答案
上次我处于类似的情况时,我发现最简单(实际上是唯一的)解决方案就是启动一个处理你的子进程的线程.您可以使用此方法采用不同的路由,无论是解析shell样式命令的管道,还是执行python代码(由于阻塞而您认为不是一个选项),这将同时修复您的杀人问题.基本上,线程封装似乎是要走的路.

遗憾的是,我在子平台上的经验都在Windows平台上,它有很多自己的小怪癖.看起来,子进程有很多瑕疵,尽管它必须做一个好的工作,因为它应该取代popen,popen2等模块的存在.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open