python 打开 windows 资源管理器

python open windows explorer

请想象这样一种情况:在GUI中显示本地文件的图标,右键单击该图标,弹出上下文菜单,其中有选项:在资源管理器中显示文件。单击该选项,然后打开资源管理器 window,并选中特定文件。许多编辑器都有这样的功能:在文件夹中显示或在资源管理器中显示

其实GUI是PyQt搭建的,我的第一个想法很简单,开一个子进程,通过命令行:

explorer /select, a_full_path_name

这个行为确实是我需要的,但是当再次点击"show in folder"时,会打开一个新的浏览器window,连旧的都不存在了!一个调皮的男孩一口气点击"show in folder"几十次怎么样?所以我只需要一个window,如果有旧的,就把它举到前面。

命令start /D a_path .可能会让淘气鬼失望(运行几次,只有一次window。)但是,没有高亮选中文件的选项,因此也让我失望...

如前所述,很多编辑器都有这样的"show in folder"功能, 但令我惊讶的是,PyCharm "Show in Explorer" 将打开多个 windows 多次点击同一个文件,还有 CodeBlocks "opening containing folder",然而 程序员的记事本 "open containing folder" 将始终只打开同一个文件的一个文件夹。(老实说,我只有 3我 PC 中的编辑器,除了 windows 记事本 :)


我的问题:
windows cmd 是否可以实现上述功能?
如果不能,有没有 python 的方法来实现?

其实我在Whosebug上找了几个相关的问题,for example, 但是我的问题没有解决,有人可以载我一程吗?

最后,好心人指导我找到了答案。
来自 https://github.com/exaile/exaile/blob/master/xl/common.py#L350

在py3+

import ctypes

ctypes.windll.ole32.CoInitialize(None)
upath = r"C:\Windows"
pidl = ctypes.windll.shell32.ILCreateFromPathW(upath)
ctypes.windll.shell32.SHOpenFolderAndSelectItems(pidl, 0, None, 0)
ctypes.windll.shell32.ILFree(pidl)
ctypes.windll.ole32.CoUninitialize()

在 py2+

只要给出一个unicode路径即可。
注意:ILCreateFromPathW (Unicode) 和 ILCreateFromPathA (ANSI)