Using subprocess to run Python script on Windows
Just found sys.executable
- the full path to the current Python executable, which can be used to run the script (instead of relying on the shbang, which obviously doesn't work on Windows)
import sys
import subprocess
theproc = subprocess.Popen([sys.executable, "myscript.py"])
theproc.communicate()
Run Python script within Python by using `subprocess.Popen` in real time
Last night I've set out to do this using a pipe:
import os
import subprocess
with open("test2", "w") as f:
f.write("""import time
print('start')
time.sleep(2)
print('done')""")
(readend, writeend) = os.pipe()
p = subprocess.Popen(['python3', '-u', 'test2'], stdout=writeend, bufsize=0)
still_open = True
output = ""
output_buf = os.read(readend, 1).decode()
while output_buf:
print(output_buf, end="")
output += output_buf
if still_open and p.poll() is not None:
os.close(writeend)
still_open = False
output_buf = os.read(readend, 1).decode()
Forcing buffering out of the picture and reading one character at the time (to make sure we do not block writes from the process having filled a buffer), closing the writing end when process finishes to make sure read catches the EOF correctly. Having looked at the subprocess
though that turned out to be a bit of an overkill. With PIPE
you get most of that for free and I ended with this which seems to work fine (call read as many times as necessary to keep emptying the pipe) with just this and assuming the process finished, you do not have to worry about polling it and/or making sure the write end of the pipe is closed to correctly detect EOF and get out of the loop:
p = subprocess.Popen(['python3', '-u', 'test2'],
stdout=subprocess.PIPE, bufsize=1,
universal_newlines=True)
output = ""
output_buf = p.stdout.readline()
while output_buf:
print(output_buf, end="")
output += output_buf
output_buf = p.stdout.readline()
This is a bit less "real-time" as it is basically line buffered.
Note: I've added -u
to you Python call, as you need to also make sure your called process' buffering does not get in the way.
Running a shell script using Subprocess in Python does not produce output
The simple and straightforward fix is to not use bare Popen
for this.
You also don't need a shell to run a subprocess; if the subprocess is a shell script, that subprocess itself will be a shell, but you don't need the help of the shell to run that script.
proc = subprocess.run(
['km/example/example1/source/test.sh'],
check=True, capture_output=True, text=True)
out = proc.stdout
If you really need to use Popen
, you need to understand its processing model. But if you are just trying to get the job done, the simple answer is don't use Popen
.
The error message actually looks like you are on Windows, and it tries to run km
via cmd
which thinks the slashes are option separators, not directory separators. Removing the shell=True
avoids this complication, and just starts a process with the requested name. (This of course still requires that the file exists in the relative file name you are specifying. Perhaps see also What exactly is current working directory? and also perhaps switch to native Windows backslashes, with an r'...'
string to prevent Python from trying to interpret the backslashes.)
Launch a python script from another script, with parameters in subprocess argument
The subprocess
library is interpreting all of your arguments, including demo_oled_v01.py
as a single argument to python. That's why python is complaining that it cannot locate a file with that name. Try running it as:
p = subprocess.Popen(['python', 'demo_oled_v01.py', '--display',
'ssd1351', '--width', '128', '--height', '128', '--interface', 'spi',
'--gpio-data-command', '20'])
See more information on Popen here.
Related Topics
How to Force a List to a Fixed Size
Rolling Mean on Pandas on a Specific Column
Python Variables as Keys to Dict
How to Find Out Whether a File Is at Its 'Eof'
How to Fix the "Element Not Interactable" Exception
Why Is the Borg Pattern Better Than the Singleton Pattern in Python
Python Mixed Integer Linear Programming
Restart Python-Script from Within Itself
Differencebetween I = I + 1 and I += 1 in a 'For' Loop
Datetime from String in Python, Best-Guessing String Format
Example of the Right Way to Use Qthread in Pyqt
How to Copy Over an Excel Sheet to Another Workbook in Python
Comparing Numpy Arrays Containing Nan
Finding the Consecutive Zeros in a Numpy Array
Python Equivalent of Filter() Getting Two Output Lists (I.E. Partition of a List)