【问题标题】:Kill a batch file containing the python script within杀死一个包含python脚本的批处理文件
【发布时间】:2018-08-21 06:20:42
【问题描述】:

我有问题。我需要使用驻留在同一批处理文件中的 python 脚本来终止批处理文件。批处理文件将 abc.py 脚本作为第一个脚本以及其他脚本。所以我需要杀死批处理文件,以免其他人被执行。这是我尝试过的:

for proc in psutil.process_iter():
     if proc.name() == "python.exe" and len(proc.cmdline()) > 1 and 
         "abc.py" in proc.cmdline()[1]:
    proc.terminate()

但这只会杀死python脚本,而不是批处理文件。尝试杀死 pid 具有相同的效果。

os.system("taskkill /F /PID " + str(os.getpid()))

编辑 1 该脚本检查是否存在另一个正在运行的脚本,然后需要自行终止。

【问题讨论】:

标签: python batch-file kill


【解决方案1】:

如果你只是想杀死你的父母,那很容易:只需使用 os.getppid() 而不是 os.getpid()

os.system("taskkill /F /PID " + str(os.getppid()))

当然,出于所有常见原因,最好使用subprocess 而不是os.system,例如在失败时获得有用的错误:

subprocess.run(['taskkill', '/F', '/PID', str(os.getppid())])

或者,更好的是,不要使用taskkill,直接使用kill。如果愿意,这也使您可以选择使用更好的 Ctrl-C or Ctrl-Break kill 代替硬 kill:

os.kill(os.getppid(), signal.CTRL_BREAK_EVENT)

如果您使用的是 Python 2.7,getppid 在 Windows 上不起作用;仅在 3.2 中添加。 (我认为os.kill 也是如此,当然signal.CTRL_BREAK_EVENT 也是如此。)

由于您显然已经可以使用 psutil,因此您可以使用它。

不需要搜索系统上的每个进程来找到自己,只需构造一个默认的Process。您可以使用parent 从任何进程转到其父进程。然后你可以使用killterminate

proc = psutil.Process().parent()
proc.kill()

以上所有,除了使用CTRL_C_EVENTCTRL_BREAK_EVENT 代替标准信号),都具有跨平台的优势——你可以在 Linux 或 macOS 或其他任何地方运行相同的脚本,它会杀死运行它的 shell 脚本。

【讨论】:

  • 感谢您的精彩解释。我想要一个程序化的解决方案。它有效!
  • @MallikKumar 一件事:这会杀死它的父级任何人。比如说,如果你不小心从你的 IDE 运行了这个程序,它会杀死你的 IDE。有问题吗?
【解决方案2】:

您的批处理文件需要检查最后一个命令是否成功,如果没有成功则退出。

How do I make a batch file terminate upon encountering an error?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多