【问题标题】:Kill only a subprocess created by python on CMD仅在 CMD 上杀死由 python 创建的子进程
【发布时间】:2020-03-27 20:57:10
【问题描述】:

我制作了一个 python 脚本,该脚本通过运行可在 Windows 和 Linux 上运行的 shell 命令使用 aria2 下载器进行下载。

os.system("aria2c " + url + options)
#some code I want to run if the process is stopped

现在,我想测试我的程序是否存在无法下载文件的情况。因此,在命令提示符 (cmd.exe) Windows 上执行 'python downloader.py' 后,我按 Ctrl+C 仅停止下载('aria2c.exe' 仅进程)但继续运行我的 python 代码。

Ubuntu 终端 上执行此操作效果很好!但在 cmd 窗口上,Ctrl+C 会停止 'aria2c.exe' 进程,但也会停止我的 python 代码。我想知道我可以在命令提示符下实现这个吗?

如果您需要知道,这就是显示在 cmd 上的内容:

    File "downloader.py", line 106, in download
      os.system(myCommand)
Keyboard interrupt

【问题讨论】:

  • 在 Win 上,如果您知道镜像名称 (aria2c.exe),您可以使用:taskkill /f /im aria2c.exe。这将终止任务并且可以通过子进程或直接在 cmd 中运行。这就是你所追求的吗?

标签: python python-3.x cmd terminal aria2


【解决方案1】:

您可以捕获KeyboardInterrupt 异常,然后执行您想要的代码。

if __name__ == '__main__':
    try:
        os.system("aria2c " + url + options)
    except KeyboardInterrupt:
        print('Keyboard Interrupt Detected')
            # the rest of your code
            pass

【讨论】:

  • name的值究竟是什么意思?
  • 这是一个特殊变量,表示脚本运行的上下文。如果它是主脚本(即,作为顶级脚本python your-top-level-script-name.py 调用),那么它将运行。这是最佳实践,因为有时当您导入脚本时,您不希望某些代码运行。你不想运行的代码应该在上面的块中
【解决方案2】:

如果您的操作系统是 windows,此代码将在单独的命令提示符中打开您的 EXE。

import os

if os.name == 'nt':
 os.system("start /wait cmd /c aria2c " + url + options)
else
 os.system("aria2c " + url + options)

【讨论】:

  • 你的意思是所有的windows操作系统都有windows'nt'之后的名字?这会打开一个单独的命令提示符窗口吗?
  • 是的,应该是。 'nt' 是 windows 的值,它会打开一个单独的窗口。
猜你喜欢
  • 2013-12-18
  • 1970-01-01
  • 2010-12-08
  • 2022-12-05
  • 2015-01-05
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多