【问题标题】:Close pdf using subprocess in python在python中使用子进程关闭pdf
【发布时间】:2021-12-06 09:50:16
【问题描述】:

我尝试关闭使用以下过程打开的 pdf:

import subprocess
openpdffile = subprocess.Popen([file_path], shell=True)    

我试过了

openpdffile.kill()

但这会使 pdf 在我的 pdf 阅读器中保持打开状态。有什么建议吗?

非常感谢。

【问题讨论】:

标签: python subprocess


【解决方案1】:

原因是subprocess.Popen 创建了一个新进程。因此,您的代码中究竟发生了什么是您正在创建一个新进程,然后您正在关闭该 new 进程。相反,您需要找出进程 id 并将其杀死。

注意:shell 命令在 Windows 系统上工作。要在 UNIX 环境中使用它们,您需要更改 shell 命令

import os
import subprocess

pid = subprocess.getoutput('tasklist | grep Notepad.exe').split()[1]
# we are taking [1] because this is the output produced by 
# 'tasklist | grep Notepad.exe'
# Image Name PID  Session Name  Session Mem Usage
# ========== ==== ============= ======= =========
# Notepad.exe 10936 Console 17  16,584 K
os.system(f'taskkill /pid {pid}')

编辑:要终止特定进程,请使用以下代码

import os
import subprocess

FILE_NAME = 'test.pdf' # Change this to your pdf file and it should work

proc = subprocess.getoutput('tasklist /fi "imagename eq Acrobat.exe" /fo csv /v /nh')
proc_list = proc.replace('"', '').split('\n')
for x in proc_list:
    p = x.split(',')
    if p[9].startswith(FILE_NAME):
        pid = p[1]
        os.system(f'taskkill /pid {pid}')

【讨论】:

  • 非常感谢 Ayush 的帮助!但是我怎么能用pdf做到这一点?是否也可以关闭该特定的pdf?
  • @Rolf12 这有点困难,因为进程列表通常包含应用程序名称,比如说如果你在 Adob​​e 中打开 pdf,那么进程列表将有 adobe.exe 但它不会显示哪个 pdf 文件你已经打开了。因此,关闭特定的 pdf 并不容易,但是您可以通过获取 pids 的列表来关闭所有 pdf 文件。
  • 非常感谢。我试过了,但在变量中我得到了字符串“is”?所以得到找不到进程的错误。我用 Acrobat.exe 替换了 notepad.exe
  • @Rolf12 经过大量研究,我发现实际上可以获取窗口标题然后检查标题中的文件名,获取进程ID并杀死它。我正在编辑中发布解决方案。给我几分钟时间
  • 非常感谢阿尤什!我尝试过这个。看起来第一次运行有效,但之后我总是收到“索引超出范围”错误,因为 proc 说“没有运行符合指定条件的任务”但是 Acrobat.exe 正在运行并且 excel 是 opn
【解决方案2】:

您可以在完成子进程的事情后获取 pid,并为方便起见确定要杀死哪个。

您可以在这里学习如何获取子进程的 pid:https://stackoverflow.com/a/7989942/13837927

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2017-01-09
    • 1970-01-01
    • 2015-09-15
    • 2017-03-31
    相关资源
    最近更新 更多