我想从基于Python的GUI应用程序启动MS-Office文档。我正在通过Subprocess模块使用命令行让Windows执行将可执行应用程序映射到文件的繁重工作,但如果文件已经在网络上某处打开,它将无声地失败。我宁愿给出一个消息框,而不是默默地失败。如何在不更改文件修改时间的情况下告知此方案?
答案 0 :(得分:1)
我发现您可以尝试将文件重命名为其当前名称。如果另一个应用程序打开了该文件,则会因PermissionError异常而失败。如果它没有失败,那么它就是一个完整的无操作。因此:
def start_file(file):
if os.path.exists(file):
try: os.rename(file, file) # This does NOTHING if the file is available, or fails.
except PermissionError: messagebox.showwarning('File in Use', 'The file appears to be already open. Sorry about that.')
else: subprocess.call(['start', '/B', file], shell=True)
else: messagebox.showwarning('Missing File', 'That files does not yet exist. Sorry about that.')
纯粹主义者会指出这至少受到一种竞争条件的影响,但从人机交互的角度来看,它确实可以在99.999%的时间内解决问题。对于其他人,我们会责怪比尔:)