我在使用Python subprocess模块时遇到了麻烦(该模块应该是一个统一/跨平台的抽象,但是不要让我开始 :))。
所以我想要的简单事情是:
所以我想要的简单事情是:
- 启动外部(stdio)应用程序(可能使用subprocess),其中我使用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)
我希望我表述得足够清楚。感谢您提供的任何提示/建议 - 我刚刚花了一整天时间研究subprocess,并且我认为它远非跨平台或简单 :( (但也许只是我)
更新(2010-10-13):
如果启动子进程(即使shell=False),则subprocess.Popen.kill()函数仅会杀死该子进程(因此如果有任何“孙子”进程,它们将不会被终止。)
我读到关于使用preexec_fn参数在所有子进程中设置sid的方法,但这只适用于Unix系统:超时一个子进程