我正在尝试构建一个小型shell应用程序,它从GUI应用程序运行命令。当我按下"关闭"按钮,应该关闭命令的控制台。我有两个问题:
当我运行该命令时,该命令在与我的Python脚本相同的控制台上运行。如何在新控制台中打开命令?
如何停止命令?我的意思是,如果命令在与GUI相同的过程中工作,我可以使用exit()
,但随后整个程序将被终止。
到目前为止,这是我的代码:
from tkinter import *
import subprocess
import os
top = Tk()
def turnOn():
p = subprocess.Popen("ping stackoverflow.com")
def turnOff():
pass
#should i do: p.close() of something?
on = Button(top, text = "on", command = turnOn)
off = Button(top, text = "off", command = turnOff)
on.grid()
off.grid()
top.mainloop()
答案 0 :(得分:0)
您可以通过调用子进程的.terminate
方法来停止命令。这是一个粗略的例子,它使用全局变量来存储Popen
对象;最好将GUI包装在一个类中,并将proc
存储为该类的实例属性。
import tkinter as tk
import subprocess
top = tk.Tk()
proc = None
def turnOn():
global proc
if proc is None:
print('Starting ping')
proc = subprocess.Popen(["ping", "example.com"])
def turnOff():
global proc
if proc is not None:
print('Stopping ping')
proc.terminate()
proc = None
on = tk.Button(top, text = "on", command = turnOn)
off = tk.Button(top, text = "off", command = turnOff)
on.grid()
off.grid()
top.mainloop()
if proc is None:
行阻止ping
命令重新启动(如果它已在运行)。
答案 1 :(得分:0)
1)当我运行命令时,cmd命令运行在与我相同的cmd上 pythoh脚本是工作。如何在另一个cmd窗口中打开命令?
我假设您试图说您需要在另一个上运行该过程 贝壳。你应该使用" shell"子进程函数的参数:
subprocess.call(cmd, shell=True)
如果您只需要另一个命令提示符窗口,则只需打开另一个Windows cmd。
2)我怎么能停止命令?我的意思是,如果命令是相同的 gui工作的窗口我可以在exit()中使用,但随后是all programm 将停止。
子进程Popen对象有一个terminate方法。你可以称之为发送SIGTERM信号,但并不总是可靠的。因此,根据您的操作系统和流程的性质,有几个选项 (一点注意:Popen对象有一个带进程pid的pid属性):
信号是取决于OS的posix / windows信号。即:
os.killpg(self.pid, signal.SIGKILL) # Posix
os.kill(self.pid, signal.CTRL_C_EVENT) # Windows
在Windows上,os.kill调用并不总是可靠的。这就是原因 使用第三个选项。