我需要通过python脚本或python程序运行'myexe'可执行文件:
./myexe arg1 arg2 >& outfile
我的方法如下:
1 import os
2 import subprocess
3 import time
4 cmd = "./myexe arg1 arg2 >& outfile"
5 print 'cmd = ', cmd
6 proc = subprocess.Popen(command, shell=True)
7 # delay for 10 seconds
8 time.sleep(10)
9 # kill the process if not finished
10 os.system("ps -e | grep \"myexe\" | awk '{print $1}'") # --- process id = x+1
11 if proc.poll() == None:
14 print 'Deliberately kill the Process= ', proc.pid # --- process id = x
15 proc.kill()
这里我注意到,当我使用io重定向时,系统命令(行号-10)打印的进程ID与else部分(行号-14)中打印的进程ID不同。
如果我使用命令“./myexe arg1 arg2”,那么进程ID的值是正确的。 那么,如何使用shell命令同时使用io重定向?
此处重定向用于同一文件中的stderr和stdout。
请帮助我解决问题并分享有效的方法来实现这一目标。 而且如果使用某种有效的方法在任意延迟之后没有完成,我如何终止(终止)进程id-x?
除此之外,我怎么能知道进程是成功终止还是通过发送kill信号: 我这样做如下:
if proc.wait() == 0:
print 'Terminate successfully'
else:
print 'Terminated by kill signal'
也可以在调用proc.kill()后设置一些标志。
它是否符合python规则/预期用法?
注意: 需要杀死进程以避免myexe可执行文件中可能发生的无限循环场景。 python脚本进一步读取outfile(此处未显示)。
答案 0 :(得分:1)
由于shell=True
参数,您的PID不同。 Python产生了一个中间shell进程。
进程树看起来像:
python yourscript.py
└─ /bin/sh -c ./myexe # PID shown on line 14
└─ ./myexe # PID shown on line 10
将第6行替换为这两行中的某些内容
outfile = open("outfile", "w")
proc = subprocess.Popen(["./myexe", "arg1", "arg2"],
stdout=outfile, stderr=outfile)
并且您的PID将匹配,而两个流将被重定向到同一个文件(确保./myexe
刷新这些流。)
如果你想使用shell,你应该参考这个问题:How to terminate a python subprocess launched with shell=True。