从Python运行命令然后关闭

时间:2017-08-01 08:39:18

标签: python user-interface windows-console

我正在尝试构建一个小型shell应用程序,它从GUI应用程序运行命令。当我按下"关闭"按钮,应该关闭命令的控制台。我有两个问题:

  1. 当我运行该命令时,该命令在与我的Python脚本相同的控制台上运行。如何在新控制台中打开命令?

  2. 如何停止命令?我的意思是,如果命令在与GUI相同的过程中工作,我可以使用exit(),但随后整个程序将被终止。

  3. 到目前为止,这是我的代码:

    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()
    

2 个答案:

答案 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.kill(pid,signal) =>杀死Posix / Windows OS上的简单进程
  • os.killpg(pgid,signal) =>在Unix OS上作为一个组杀死进程
  • subprocess.Popen(" taskkill / F / T / PID%i"%pid,shell = True) =>杀死Windows上的进程

信号是取决于OS的posix / windows信号。即:

os.killpg(self.pid, signal.SIGKILL)     # Posix
os.kill(self.pid, signal.CTRL_C_EVENT)  # Windows

在Windows上,os.kill调用并不总是可靠的。这就是原因 使用第三个选项。