我正在考虑webbrowser模块的内容,但是对于文件浏览器。在Windows中我想打开资源管理器,在Linux上的GNOME中我想打开nautilus,在KDE上打开Konqueror等等。如果我能避免它,我宁愿不要破解它。 ; - )
答案 0 :(得分:16)
如果我可以避免它,我宁愿不把它搞砸。
Weeell我认为你需要一点平台嗅探kludge,但希望不如可怕的命令嗅探webbrowser
模块。这是对它的第一次尝试:
if sys.platform=='win32':
subprocess.Popen(['start', d], shell= True)
elif sys.platform=='darwin':
subprocess.Popen(['open', d])
else:
try:
subprocess.Popen(['xdg-open', d])
except OSError:
# er, think of something else to try
# xdg-open *should* be supported by recent Gnome, KDE, Xfce
请注意,对于文件名中的空格,win32版本当前将失败。 Bug 2304可能与此有关,但似乎存在参数转义和Windows shell(cmd /c ...
)的基本问题,因为你无法嵌套双引号,你可以't ^ -escape引号或空格。我还没有找到任何方法来引用并从命令行运行cmd /c start C:\Documents and Settings
。
ETA re nosklo的评论:仅在Windows上,有一种内置方式可以做到:
if sys.platform=='win32':
os.startfile(d)
这是找到shell并用它打开一个文件夹的不太好的替代解决方案,你现在不需要它,但我会留下来。(部分原因是因为它可能用于别的东西,但主要是因为我花时间打死该死的东西!)
if sys.platform=='win32':
import _winreg
path= r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon')
for root in (_winreg.HKEY_CURRENT_USER, _winreg.HKEY_LOCAL_MACHINE):
try:
with _winreg.OpenKey(root, path) as k:
value, regtype= _winreg.QueryValueEx(k, 'Shell')
except WindowsError:
pass
else:
if regtype in (_winreg.REG_SZ, _winreg.REG_EXPAND_SZ):
shell= value
break
else:
shell= 'Explorer.exe'
subprocess.Popen([shell, d])
答案 1 :(得分:-1)
这是一个彻头彻尾的黑暗,但请看一下wxPython,它提供了与底层wxWidgets库的Python绑定。自从我上次查看它以来已经很长时间了,但可能会有一些你可以使用的东西。否则,创建自己的文件浏览器应该相对容易,该浏览器将为每个操作系统使用本机“小部件”。
请注意,wxPython不是轻量级的,它会真正增加你的应用程序并增加你的依赖。
答案 2 :(得分:-1)
我不知道是否存在即用型模块,但是如果存在,它应该在Activestate的python cookbok(http://code.activestate.com/recipes/langs/python/)上
此外,至少在gnome和mac os上,你可以执行“gnome-open http://blah”和“open http://blah”(在mac上);两者都会在用户首选的浏览器中打开网址。
对于linux,还要检查freedesktop.org--一个涵盖Gnome和KDE的常用工具集,应该包含类似的内容。