Python 3.x Python:启动shortcut.lnk文件(并等待)

Python 3.x Python:启动shortcut.lnk文件(并等待),python-3.x,windows-10,subprocess,shortcut,Python 3.x,Windows 10,Subprocess,Shortcut,在我看来,subprocess.call(“path.lnk”)和subprocess.call(“start”“”path.lnk“)目前在适用于Windows 10的Python 3.x上都不起作用。这些曾经有用,或者至少我发誓有用,但我没有什么可测试的 subprocess.call(“path.lnk”)和subprocess.call([“path.lnk”])都是 返回: subprocess.call('start''path.lnk')和subprocess.call(['sta

在我看来,
subprocess.call(“path.lnk”)
subprocess.call(“start”“”path.lnk“)
目前在适用于Windows 10的Python 3.x上都不起作用。这些曾经有用,或者至少我发誓有用,但我没有什么可测试的

subprocess.call(“path.lnk”)和subprocess.call([“path.lnk”])都是 返回:

subprocess.call('start''path.lnk')和subprocess.call(['start'' “path.lnk”'])

两者都返回:

FileNotFoundError: [WinError 2] The system cannot find the file specified.
如果我打开cmd.exe并尝试“path.lnk”和/或启动“path.lnk”,两者都可以正常工作。只有在从
子流程调用(/Popen)
运行时,这些命令才会失败

os.startfile(“path.lnk”)
功能齐全,但存在无法等待进程完成的严重限制。没有.wait()方法。 从文档中:

启动关联的应用程序后,startfile()立即返回。 没有等待应用程序关闭的选项,也没有方法关闭 检索应用程序的退出状态

来自subprocess.call的堆栈跟踪(winerror和FileError)指向

在这个话题上有几个相关的问题。 这个 其中有一条评论说

目前,这似乎只适用于将shell=True包含在 呼叫我怀疑这是由于Windows的变化,而不是Python的变化, 从2011年开始,尽管我无法证明。我甚至不知道是哪条蟒蛇 我在2011年测试过这个版本(我甚至不记得写过什么) 答案是:))

我尝试通过以下四种方式将其合并:
subprocess.call([''path.lnk“shell=True'])
返回:
[WinError 5]访问被拒绝
(与往常一样从第1420行开始)

我将
shell=True
直接放在上面的字符串中,应该这样做:

subprocess.call(['start "" "path.lnk"', start=True]) 
这将运行快捷方式,但受到与其他命令相同的限制,no wait

这篇文章给出了一个答案,其中提到使用这个代码片段来实现.wait()-esq功能

import win32com.shell.shell as shell
import win32event
    
se_ret = shell.ShellExecuteEx(fMask=0x140, lpFile=r"D:\games\blender.lnk", 
nShow=1)
win32event.WaitForSingleObject(se_ret['hProcess'], -1)
对我来说,这并不是真正的等待。。。耸耸肩

我还找到了一个相关的答案:

如果您试图打开包含命令的快捷方式文件 注册中心,以上答案无效。不过解决办法很简单

  • 添加/c标志:cmd.exe/c:\pathtosortcut\AdultContent.lnk
为了这个我试过了

subprocess.call('cmd.exe /c "path.lnk"')
这与os.startfile的工作原理相同,但它实际上并不等待进程完成,而且似乎不允许任何等待

值得注意的是,在出现FileNotFoundError的所有情况下,我都尝试使用r“”路径反转/和,只是为了好玩,使用%s设置字符串格式

我可以感觉到自己正在试图创建一个.bat文件,启动快捷方式并等待,然后从subprocess.call启动bat以实现所需的行为。然而,这感觉很脏,似乎不必要。如果没有其他解决方案可以提供,我会尝试,并提供了我的批脚本在一个答案,如果它的工作

import win32com.shell.shell as shell
import win32event
    
se_ret = shell.ShellExecuteEx(fMask=0x140, lpFile=r"D:\games\blender.lnk", 
nShow=1)
win32event.WaitForSingleObject(se_ret['hProcess'], -1)
subprocess.call('cmd.exe /c "path.lnk"')