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()
# 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
6条答案
按热度按时间lfapxunr1#
我相信这个问题的措辞有点误导-实际上你想关闭你用
os.startfile(file_name)
打开的应用程序。不幸的是,
os.startfile
没有为返回的进程给予任何句柄。startfile会在关联的应用程序启动后立即返回。没有等待应用程序关闭的选项,也无法检索应用程序的退出状态。
幸运的是,您有一种通过shell打开文件的替代方法:
返回的pid是父shell的pid,而不是你的进程本身的pid。杀死它是不够的-它只会杀死一个shell,而不是子进程。我们需要到达子进程:
这是你想要关闭的pid。现在我们可以终止进程了:
请注意,这在Windows上有点复杂-没有
os.killpg
更多信息:How to terminate a python subprocess launched with shell=True另外,我在尝试用
os.kill
杀死shell进程本身时收到了PermissionError: [WinError 5] Access is denied
subprocess.check_output("Taskkill /PID %d /F" % child_pid)
适用于我的任何进程,没有权限错误参见WindowsError: [Error 5] Access is deniedweylhg0b2#
为了正确地获取子节点的PID,可以添加一个 while 循环
vzgqcmou3#
os.startfile()
帮助启动应用程序,但没有退出、终止或关闭已启动应用程序的选项。另一种方法是以这种方式使用子流程:
wz3gfoph4#
基于this SO post,没有办法关闭使用
os.startfile()
打开的文件。类似的事情在this Quora post中讨论。但是,正如Quora帖子中所建议的那样,使用不同的工具打开文件,例如
subprocess
或open()
,将授予您更大的控制权来处理文件。我假设你正在尝试读取数据,所以关于你不想手动关闭文件的评论,你可以使用
with
语句,例如。有点麻烦,因为你还必须做一个
read()
,但它可能更适合你的需要。r6hnlfcb5#
os.system('taskkill /f /im Rainmeter.exe')
为我工作在我的例子中,我使用
os.startfile("C:\\Program Files\\Rainmeter\\Rainmeter.exe")
命令打开Rainmeter.exe,用你的替换文件和路径1u4esq0p6#
对于excel文件,已使用任何机制打开