I’ve a python script that has to launch a shell command for every file in a dir:
import os
files = os.listdir(".")
for f in files:
os.execlp("myscript", "myscript", f)
This works fine for the first file, but after the “myscript” command has ended, the execution stops and does not come back to the python script.
How can I do? Do I have to fork() before calling os.execlp()?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
subprocess: The
subprocessmodule
allows you to spawn new processes,
connect to their input/output/error
pipes, and obtain their return codes.
http://docs.python.org/library/subprocess.html
Usage:
import subprocess process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) process.wait() print process.returncode
Method 2
You can use subprocess.Popen. There’s a few ways to do it:
import subprocess
cmd = ['/run/myscript', '--arg', 'value']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in p.stdout:
print line
p.wait()
print p.returncode
Or, if you don’t care what the external program actually does:
cmd = ['/run/myscript', '--arg', 'value'] subprocess.Popen(cmd).wait()
Method 3
The subprocess module has come along way since 2008. In particular check_call and check_output make simple subprocess stuff even easier. The check_* family of functions are nice it that they raise an exception if something goes wrong.
import os
import subprocess
files = os.listdir('.')
for f in files:
subprocess.check_call( [ 'myscript', f ] )
Any output generated by myscript will display as though your process produced the output (technically myscript and your python script share the same stdout). There are a couple of ways to avoid this.
check_call( [ 'myscript', f ], stdout=subprocess.PIPE )
The stdout will be supressed (beware ifmyscriptproduces more that 4k of output). stderr will still be shown unless you add the optionstderr=subprocess.PIPE.check_output( [ 'myscript', f ] )
check_outputreturns the stdout as a string so it isnt shown. stderr is still shown unless you add the optionstderr=subprocess.STDOUT.
Method 4
The os.exec*() functions replace the current programm with the new one. When this programm ends so does your process. You probably want os.system().
Method 5
use spawn
import os os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
Method 6
I use os.system
import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))
Method 7
this worked for me fine!
shell_command = "ls -l"
subprocess.call(shell_command.split())
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0