带有 shell=True : redirections and platform-independent subprocess killing 的 python 子进程

标签 python shell logging subprocess redirect

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

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

  • 启动一个外部 (stdio) 应用程序(可能带有子进程),我在其中使用 shell 样式的重定向(例如 './myapp >stdout_log >stderr_log')
    • 基本上我想执行 shell 命令行,所以我必须为 subprocess.Popen() 指定 shell=True(否则命令行中的重定向将不起作用)
  • 我想以异步方式启动此命令行(因此它作为独立的子进程运行,但我的 python 进程不会等待它完成)
  • (我的父python进程会不时查看子进程的日志以提取信息,但这与问题无关)
  • 如果我的父 python 进程决定,它应该能够终止这个子进程。

现在,我的主要问题是

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

我希望我足够具体。感谢您提前提供任何提示/提示——我刚刚花了一整天的时间处理子流程,恕我直言,这远非平台独立或简单的痛苦:((但也许只有我)

更新(2010-10-13):

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

我读到过有关使用 preexec_fn 参数在所有子进程上设置 sid 的信息,但它仅适用于 unix:timeout a subprocess

最佳答案

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

遗憾的是,我对 subprocess 的体验都是在 Windows 平台上进行的,它有很多自己的小怪癖。 subprocess 似乎有很多缺陷,尽管它在 popenpopen2 等存在的情况下一定做得不错它应该替换的第四个模块。

关于带有 shell=True : redirections and platform-independent subprocess killing 的 python 子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3908063/

相关文章:

python - 请求——如何判断您是否收到了成功消息?

shell - 让 telnet 在一行中执行单个命令

javascript - 如何在for-in循环中打印出对象属性?

python - 弃用 DataFrame.ix 意味着什么?

python - PyCharm 2018.3.3 中 Flask 运行配置中的红色 X 意味着什么?

python - plt.subplot 轴共享不起作用

linux - 在另一个文件中反射(reflect)一个文件的类型

linux - Init.d 脚本不启动或停止只打印帮助信息

java - 配置 Sentry 以使用 log4j2 进行日志记录时出错

java - 如何将spylog与tomcat 7和hibernate集成?