====== Program execution from Python ====== The right module to use is **[[http://docs.python.org/library/subprocess.html|subprocess]]**. Older modules and functions that should be avoided are: * os.system * os.spawn* * os.popen* * popen2.* * commands.* ===== Run a command ===== Run command with arguments. Wait for command to complete, then return the returncode attribute. retcode = subprocess.call(["mycmd", "myarg"]) Same as above, but run in a subshell (in this case the command may contain shell redirections): retcode = subprocess.call("mycmd myarg", shell=True) ===== Get the output of a program ===== Assign the output to a variable: output = subprocess.Popen(["mycmd", "myarg"], stdout=subprocess.PIPE).communicate()[0].decode('utf-8') Get also the return code, stderr and iterate on the output: subproc = subprocess.Popen(["mycmd", "myarg"], stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, stderr = subproc.communicate() retcode = subproc.returncode for line in output.decode('utf-8').splitlines(): print(line) ===== Redirect output to a file ===== file = open("/tmp/cmd_output", "w") subprocess.call(["mycmd", "myarg"], stdout=file) file.close() ===== Run two commands in a pipe ===== cmd1 = ["oggdec", "-Q", "-o", "-", src] cmd2 = ["lame", "--preset", "cd", "-", dst] p1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE) p2 = subprocess.Popen(cmd2, stdin=p1.stdout, stdout=subprocess.PIPE) p1.stdout.close() output = p2.communicate()[0] ===== Write to command standard input ===== cmd_input = [] cmd_input.append('line input one') cmd_input.append('line input two') p = subprocess.Popen('command', stdin=subprocess.PIPE) p.communicate(os.linesep.join(cmd_input))