Launch a shell command with in a python script, wait for the termination and return to the script

PythonSubprocessPopenos.execl

Python Problem Overview


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()?

Python Solutions


Solution 1 - Python

> subprocess: The subprocess module > 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

Solution 2 - Python

You can use http://docs.python.org/library/subprocess.html">`subprocess.Popen`</a>;. 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()

Solution 3 - Python

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 if myscript produces more that 4k of output). stderr will still be shown unless you add the option stderr=subprocess.PIPE.

  • check_output( [ 'myscript', f ] )
    check_output returns the stdout as a string so it isnt shown. stderr is still shown unless you add the option stderr=subprocess.STDOUT.

Solution 4 - Python

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().

Solution 5 - Python

use spawn

import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')

Solution 6 - Python

I use os.system

import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))

Solution 7 - Python

this worked for me fine!

shell_command = "ls -l" subprocess.call(shell_command.split())

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDavide GualanoView Question on Stackoverflow
Solution 1 - Pythonuser39307View Answer on Stackoverflow
Solution 2 - PythonHarley HolcombeView Answer on Stackoverflow
Solution 3 - Pythondeft_codeView Answer on Stackoverflow
Solution 4 - PythonunbeknownView Answer on Stackoverflow
Solution 5 - PythonM. Utku ALTINKAYAView Answer on Stackoverflow
Solution 6 - PythonNikolay FrickView Answer on Stackoverflow
Solution 7 - Pythonkabrapankaj32View Answer on Stackoverflow