Is there an platform independent equivalent of os.startfile()?
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])
What is an alternative for os.startfile() for a mac user?
You can try os.system
with open
. For example:
os.system("open Untitled.pdf")
This will open the file Untitled.pdf with the default PDF application ('Preview', in my case). Open document with default OS application in Python, both in Windows and Mac OS
open
and start
are command-interpreter things for Mac OS/X and Windows respectively, to do this.
To call them from Python, you can either use subprocess
module or os.system()
.
Here are considerations on which package to use:
You can call them via
os.system
, which works, but...Escaping:
os.system
only works with filenames that don't have any spaces or other shell metacharacters in the pathname (e.g.A:\abc\def\a.txt
), or else these need to be escaped. There isshlex.quote
for Unix-like systems, but nothing really standard for Windows. Maybe see also python, windows : parsing command lines with shlex- MacOS/X:
os.system("open " + shlex.quote(filename))
- Windows:
os.system("start " + filename)
where properly speakingfilename
should be escaped, too.
- MacOS/X:
You can also call them via
subprocess
module, but...For Python 2.7 and newer, simply use
In Python 3.5+ you can equivalently use the slightly more complex but also somewhat more versatilesubprocess.check_call(['open', filename])
If you need to be compatible all the way back to Python 2.4, you can usesubprocess.run(['open', filename], check=True)
subprocess.call()
and implement your own error checking:
Now, what are the advantages of usingtry:
retcode = subprocess.call("open " + filename, shell=True)
if retcode < 0:
print >>sys.stderr, "Child was terminated by signal", -retcode
else:
print >>sys.stderr, "Child returned", retcode
except OSError, e:
print >>sys.stderr, "Execution failed:", esubprocess
?- Security: In theory, this is more secure, but in fact we're needing to execute a command line one way or the other; in either environment, we need the environment and services to interpret, get paths, and so forth. In neither case are we executing arbitrary text, so it doesn't have an inherent "but you can type
'filename ; rm -rf /'
" problem, and if the file name can be corrupted, usingsubprocess.call
gives us little additional protection. - Error handling: It doesn't actually give us any more error detection, we're still depending on the
retcode
in either case; but the behavior to explicitly raise an exception in the case of an error will certainly help you notice if there is a failure (though in some scenarios, a traceback might not at all be more helpful than simply ignoring the error). - Spawns a (non-blocking) subprocess: We don't need to wait for the child process, since we're by problem statement starting a separate process.
subprocess
is preferred." However,os.system()
is not deprecated, and it's in some sense the simplest tool for this particular job. Conclusion: usingos.system()
is therefore also a correct answer.A marked disadvantage is that the Windows
start
command requires you to pass inshell=True
which negates most of the benefits of usingsubprocess
.- Security: In theory, this is more secure, but in fact we're needing to execute a command line one way or the other; in either environment, we need the environment and services to interpret, get paths, and so forth. In neither case are we executing arbitrary text, so it doesn't have an inherent "but you can type
AttributeError: 'module' object has no attribute 'startfile'
On Linux you can use:
import subprocess, sys
opener = "open" if sys.platform == "darwin" else "xdg-open"
subprocess.call([opener, filename])
Adopted from here
Related Topics
What Does Model.Train() Do in Pytorch
Pip Is Not Able to Install Packages Correctly: Permission Denied Error
How to Upsert Pandas Dataframe to Microsoft SQL Server Table
How to Exit from Python Without Traceback
How to Get the Ip Address from a Http Request Using the Requests Library
Built in Python Hash() Function
Python: Multiplication Override
Differencebetween 'Py' and 'Python' in the Windows Terminal
How to Get the Version Defined in Setup.Py (Setuptools) in My Package
Understanding the Python with Statement and Context Managers
Detect File Change Without Polling
How to Add Trendline in Python Matplotlib Dot (Scatter) Graphs
Join Two Lists of Dictionaries on a Single Key
Difference Between Variable and Get_Variable in Tensorflow
Vectorized Numpy Linspace for Multiple Start and Stop Values