我正在编写一个脚本,该脚本应该从linux中的python内部启动第三方程序的交互式shell(第三方程序是Stata)。该脚本的目的是控制交互式外壳的stdin和stdout,以便我可以从编辑器和其他脚本中访问它。
从Linux Shell中启动时,Stata会启动一个交互式Shell,您可以在其中运行Stata命令。当我按Control + C或使用其他方式将SIGINT信号发送到Stata时,它将停止执行当前命令并返回到交互式Shell,但不会终止Stata进程。我想为从python启动的Stata复制此行为。
当我向从python启动的Stata进程发送SIGINT信号时,它将杀死该进程,而不仅仅是停止执行当前命令。
shell中的行为是:
> /usr/local/stata14/stata
(...other stuff...)
. forval i = 1/100000 {
2. sleep 10
3. di "`i'"
4. }
1
2
3
4
(I hit CTRL+C)
--Break--
r(1);
.
以下python程序从python内部启动Stata:
def handler(signum, frame):
stata.send_signal(signal.SIGINT)
signal.signal(signal.SIGINT, handler)
stata = subprocess.Popen(["/usr/local/stata14/stata"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=os.setpgrp)
(... other stuff hat handles forwarding stata.stdout to sys.stdout in a separate thread...)
while true:
time.sleep(0.1)
userinput = raw_input(". ")
print(userinput, file=stata.stdin)
stata.stdin.flush()
print(stata.poll())
在子进程中运行相同的for循环,会产生:
> /usr/local/stata14/stata
. forval i = 1/100000 {
2. sleep 10
3. di "`i'"
4. }
1
2
3
4
-2
-2
-2
,然后再尝试写入stata.stdin都会产生
print(userinput, file=stata.stdin)
IOError: [Errno 32] Broken pipe
任何人都知道为什么会这样吗?我已经尝试过使用subprocess.Popen和shell = True。在这种情况下,Popen启动sh进程和Stata进程。如果我将SIGINT发送到sh进程,则什么也不会发生。如果我将其发送给Stata,则会出现与shell = False相同的问题。
谢谢。