python平台无关_python - 带有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不是一个选项,因为我找不到以非等待方式进行处理的功能(并且在子进程运行时,父python进程必须执行其他操作)。

如果我使用shell=true,那么subprocess.kill()将只终止shell,而不终止子进程。

我需要一个可靠的子进程终止方法,可以在任何平台上工作(但至少是Linux和Windows)

我希望我足够具体。感谢提前提供的任何提示/提示——我刚刚花了一整天的时间在子流程上,而且我觉得这与平台独立性或简单性都有很大的区别:(但也许只是我自己)

更新(2010-10-13):

如果启动一个子进程(即使shell=false),那么sub process.popen.kill()函数将只杀死该子进程(因此,如果有任何“孙子”进程,则不会终止它们)。

我读过有关使用preexec_fn参数在所有子进程上设置sid的文章,但它只是unix:timeout a subprocess

最佳答案

上一次我遇到类似情况时,我发现最简单(实际上也是唯一)的解决方案是启动一个线程来处理您的孩子的过程。使用这个方法,你可以选择不同的路径,比如解析shell样式命令的管道,并在python代码中执行这些操作(你说,由于阻塞,这不是一个选项),这将同时解决你的杀戮问题。基本上,线程封装似乎是一种可行的方法。

不幸的是,我对subprocess的体验都是在Windows平台上进行的,它有很多自己的小怪癖。subprocess似乎有很多缺陷,尽管它必须做一个好的工作,鉴于存在它应该替换的popen、popen2等模块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值