Is there an platform independent equivalent of os.startfile()?

╄→尐↘猪︶ㄣ 提交于 2019-11-28 18:46:30

It appears that a cross-platform file opening module does not yet exist, but you can rely on existing infrastructure of the popular systems. This snippet covers Windows, MacOS and Unix-like systems (Linux, FreeBSD, Solaris...):

import os, sys, subprocess

def open_file(filename):
    if sys.platform == "win32":
        os.startfile(filename)
    else:
        opener ="open" if sys.platform == "darwin" else "xdg-open"
        subprocess.call([opener, filename])

Just use webbrowser.open(filename). it can call os.startfile(), open, xdg-open where appropriate.

Beware, there is a scary text in the docs:

Note that on some platforms, trying to open a filename using this function, may work and start the operating system’s associated program. However, this is neither supported nor portable.

It works fine for me. Test it in your environment.

Look at webbrower's source code to see how much work needs to be done to be portable.

There is also an open issue on Python bug tracker -- Add shutil.open. "portable os.startfile()" interface turned out to be more complex than expected. You could try the submitted patches e.g., shutil.launch().

It depend what you mean with platform independent. If your question is about how to open anything using the default action of the OS, for example, when you double click on some file to let the OS decide how to open it, then the simple answer is no.

However, to implement this functionality yourself, is very easy, but you need to use a few different methods to accommodate for different OS's. That said, the most forgiving method is to use os.system(WinPathWithArgs) as I have explained in this answer.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!