如何关闭使用 os.startfile()、Python 3.6 打开的文件

How do I close a file opened using os.startfile(), Python 3.6

我想关闭一些我使用 os.startfile() 打开的文件,例如 .txt、.csv、.xlsx。

我知道之前有人问过这个问题,但我没有找到任何有用的脚本。

我用windows10环境

基于 this SO post, there's no way to close the file being opened with os.startfile(). Similar things are discussed in this Quora post。

但是,正如 Quora post 中所建议的那样,使用不同的工具打开您的文件,例如 subprocessopen(),将赋予您更大的控制权来处理您的文件文件。

我假设您正在尝试读取数据,因此关于您不想手动关闭文件的评论,您始终可以使用 with 语句,例如

with open('foo') as f:
    foo = f.read()

有点麻烦,因为您还必须做一个 read(),但它可能更适合您的需要。

我认为问题的措辞有点误导 - 实际上你想关闭你用 os.startfile(file_name)

打开的应用程序

不幸的是,os.startfile 没有为您提供返回进程的任何句柄。 help(os.startfile)

startfile returns as soon as the associated application is launched. There is no option to wait for the application to close, and no way to retrieve the application's exit status.

幸运的是,您有另一种方法可以通过 shell:

打开文件
shell_process = subprocess.Popen([file_name],shell=True) 
print(shell_process.pid)

返回的 pid 是 parent shell 的 pid,而不是您进程本身的 pid。 杀死它是不够的——它只会杀死一个 shell,而不是 child 进程。 我们需要到达 child:

parent = psutil.Process(shell_process.pid)
children = parent.children(recursive=True)
print(children)
child_pid = children[0].pid
print(child_pid)

这是您要关闭的 pid。 现在我们可以终止进程了:

os.kill(child_pid, signal.SIGTERM)
# or
subprocess.check_output("Taskkill /PID %d /F" % child_pid)

请注意,这在 windows 上有点复杂 - 没有 os.killpg 更多信息:How to terminate a python subprocess launched with shell=True

此外,我在尝试使用 os.kill

终止 shell 进程本身时收到 PermissionError: [WinError 5] Access is denied
os.kill(shell_process.pid, signal.SIGTERM)

subprocess.check_output("Taskkill /PID %d /F" % child_pid) 为我的任何进程工作,没有权限错误 参见 WindowsError: [Error 5] Access is denied

为了正确获取children的pid,可以添加一个while循环


import subprocess
import psutil
import os
import time
import signal
shell_process = subprocess.Popen([r'C:\Pt_Python\data.mp4'],shell=True)
parent = psutil.Process(shell_process.pid)
while(parent.children() == []):
    continue
children = parent.children()
print(children)

os.startfile() 有助于启动应用程序,但无法选择退出、终止或关闭已启动的应用程序。

另一种选择是以这种方式使用子流程:

import subprocess
import time

# File (a CAD in this case) and Program (desired CAD software in this case) # r: raw strings
file = r"F:\Pradnil Kamble\GetThisOpen.3dm"
prog = r"C:\Program Files\Rhino\Rhino.exe"

# Open file with desired program 
OpenIt = subprocess.Popen([prog, file])

# keep it open for 30 seconds
time.sleep(30)

# close the file and the program 
OpenIt.terminate()