How to make a call to an executable from Python script?
For executing the external program, do this:
import subprocess
args = ("bin/bar", "-c", "somefile.xml", "-d", "text.txt", "-r", "aString", "-f", "anotherString")
#Or just:
#args = "bin/bar -c somefile.xml -d text.txt -r aString -f anotherString".split()
popen = subprocess.Popen(args, stdout=subprocess.PIPE)
popen.wait()
output = popen.stdout.read()
print output
And yes, assuming your bin/bar
program wrote some other assorted files to disk, you can open them as normal with open("path/to/output/file.txt")
. Note that you don't need to rely on a subshell to redirect the output to a file on disk named "output" if you don't want to. I'm showing here how to directly read the output into your python program without going to disk in between.
Running an outside program (executable) in Python?
Those whitespaces can really be a bother. Try os.chdir('C:/Documents\ and\ Settings/')
followed by relative paths for os.system
, subprocess
methods, or whatever...
If best-effort attempts to bypass the whitespaces-in-path hurdle keep failing, then my next best suggestion is to avoid having blanks in your crucial paths. Couldn't you make a blanks-less directory, copy the crucial .exe
file there, and try that? Are those havoc-wrecking space absolutely essential to your well-being...?
Running a C executable from Python with command line arguments
The >
that you use in your command is a shell-specific syntax for output redirection. If you want to do the same through Python, you will have to invoke the shell to do it for you, with shell=True
and with a single command line (not a list).
Like this:
subprocess.run(f'/home/dev/Desktop/myfile "{inputFileName}" > "{outputFileName}"', shell=True)
If you want to do this through Python only without invoking the shell (which is what shell=True
does) take a look at this other Q&A: How to redirect output with subprocess in Python?
How to get a python script to run as an executable?
Add this to the top of your script
#!/usr/bin/env python
or
#!/usr/bin/env python3
depending if you want python2 or python 3
How do I execute a program or call a system command?
Use the subprocess
module in the standard library:
import subprocess
subprocess.run(["ls", "-l"])
The advantage of subprocess.run
over os.system
is that it is more flexible (you can get the stdout
, stderr
, the "real" status code, better error handling, etc...).
Even the documentation for os.system
recommends using subprocess
instead:
The
subprocess
module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function. See the Replacing Older Functions with the subprocess Module section in thesubprocess
documentation for some helpful recipes.
On Python 3.4 and earlier, use subprocess.call
instead of .run
:
subprocess.call(["ls", "-l"])
How can I make a Python script standalone executable to run without ANY dependency?
You can use py2exe as already answered and use Cython to convert your key .py
files in .pyc
, C compiled files, like .dll
in Windows and .so
on Linux.
It is much harder to revert than common .pyo
and .pyc
files (and also gain in performance!).
Related Topics
In Python, How to Read the Exif Data for an Image
Postgresql: How to Install Plpythonu Extension
Creating Same Random Number Sequence in Python, Numpy and R
Display Image as Grayscale Using Matplotlib
Python: Problem with Raw_Input Reading a Number
Is There a Decorator to Simply Cache Function Return Values
How to Make a Multi-Color Line in Matplotlib
How to Split a Column of Tuples in a Pandas Dataframe
Keras Not Training on Entire Dataset
How to Replace Text in a String Column of a Pandas Dataframe
Shutting Down Computer (Linux) Using Python
Oserror: Cannot Load Library 'C:\Program Files\R\R-4.0.2\Bin\X64\R.Dll': Error 0X7E
"Getaddrinfo Failed", What Does That Mean
Create a .CSV File with Values from a Python List
Find Shortest Matches Between Two Strings