【问题标题】:python execute subprocess without waiting for subprocess to terminatepython执行子进程而不等待子进程终止
【发布时间】:2013-11-08 16:21:24
【问题描述】:

是否可以在不等待子进程终止的情况下启动子进程? 我有一个需要在 python 脚本中执行的 Windows 程序,我想让它在后台运行而不等待子进程退出,因为程序期望输入自行终止(按 q 退出)。

我尝试了很多方法,但都没有奏效。

我基本上想要实现的是以下几点:

args = [os.path.join(path, 'myProgram.exe'), '/run']

p = subprocess.Popen(args) 

在 myProgram.exe 仍在运行的情况下在这里做一些其他的事情。

myProgram.exe 也可以作为服务安装。当我尝试这种方法时,

subprocess.call('net start myService', shell=True)

服务总是无法启动。它失败并显示系统错误代码 1067,这意味着进程意外终止。

注意:我使用的是 python 2.7

感谢您的建议。

编辑: 我找到了一个我不明白的解决方法...... 作为解决方法,我创建了一个启动 myProgram.exe 的 myProgram.bat 文件。 但是有一个问题,如果我只这样做

启动 myProgram.exe

它的行为与调用子进程时完全相同 - 它终止。但是,如果我这样做了

超时 0 -- @表示等待 0 秒

启动 myProgram.exe

程序正常启动。

【问题讨论】:

  • 我不清楚为什么第一种方法行不通?这正是我的建议……
  • 这也是我的问题。这两种方法都应该有效。我不只是知道为什么程序被终止。加上它以返回码 1 结尾,这意味着有一些错误,但我无法以任何方式到达错误。它不在程序的日志中,也不在 strerr 中。

标签: python windows python-2.7 cmd subprocess


【解决方案1】:

如果程序希望q 退出,可以发送一个吗?

args = [os.path.join(path, 'myProgram.exe'), '/run']
p = subprocess.Popen(args, stdin=subprocess.PIPE)
...
p.stdin.write("q\n")

【讨论】:

  • 当我这样做时: > p = subprocess.Popen(args, stdin=subprocess.PIPE) subprocess.Popen 执行程序并立即终止。我不想退出那个程序。
【解决方案2】:

你可以试试:

args = ['start', os.path.join(path, 'myProgram.exe'), '/run']

请参阅start /? 寻求帮助(或http://www.computerhope.com/starthlp.htm

【讨论】:

  • 试过:args = ['start', os.path.join(path, 'myProgram.exe'), '/run'] p = subprocess.Popen(args, shell=True) 但是窗口打开并立即关闭。
  • 如果你在命令行输入myProgram.exe /run会发生什么? start 只是打开一个新的命令行,然后返回 python...
猜你喜欢
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多