如何关闭使用os.startfile()打开的文件,Python3.6

ngynwnxp  于 2023-03-24  发布在  Python
关注(0)|答案(6)|浏览(317)

我想关闭一些文件,如.txt,.csv,.xlsx,我已经使用os.startfile()打开。
我知道这个问题之前问过,但我没有找到任何有用的脚本。
我用的是windows 10环境

lfapxunr

lfapxunr1#

我相信这个问题的措辞有点误导-实际上你想关闭你用os.startfile(file_name)打开的应用程序。
不幸的是,os.startfile没有为返回的进程给予任何句柄。
startfile会在关联的应用程序启动后立即返回。没有等待应用程序关闭的选项,也无法检索应用程序的退出状态。
幸运的是,您有一种通过shell打开文件的替代方法:

shell_process = subprocess.Popen([file_name],shell=True) 
print(shell_process.pid)

返回的pid是父shell的pid,而不是你的进程本身的pid。杀死它是不够的-它只会杀死一个shell,而不是子进程。我们需要到达子进程:

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

weylhg0b

weylhg0b2#

为了正确地获取子节点的PID,可以添加一个 while 循环

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

vzgqcmou3#

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

wz3gfoph4#

基于this SO post,没有办法关闭使用os.startfile()打开的文件。类似的事情在this Quora post中讨论。
但是,正如Quora帖子中所建议的那样,使用不同的工具打开文件,例如subprocessopen(),将授予您更大的控制权来处理文件。
我假设你正在尝试读取数据,所以关于你不想手动关闭文件的评论,你可以使用with语句,例如。

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

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

r6hnlfcb

r6hnlfcb5#

os.system('taskkill /f /im Rainmeter.exe')为我工作
在我的例子中,我使用os.startfile("C:\\Program Files\\Rainmeter\\Rainmeter.exe")命令打开Rainmeter.exe,用你的替换文件和路径

1u4esq0p

1u4esq0p6#

对于excel文件,已使用任何机制打开

# function to close a workbook given name
def close_wb(wbname):
    import xlwings as xw    
    try: 
        app = xw.apps.active # get the active Excel application
        print ('closing workbook',wbname)
        # make workbook with given name active
        wb = app.books[wbname]
        wb.close()
    except: pass

相关问题