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"')