Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Any way to assign terminal output to variable with python?

I need to grab the duration of a video file via python as part of a larger script. I know I can use ffmpeg to grab the duration, but I need to be able to save that output as a variable back in python. I thought this would work, but it's giving me a value of 0:

cmd = 'ffmpeg -i %s 2>&1 | grep "Duration" | cut -d \' \' -f 4 | sed s/,//' % ("Video.mov")
duration = os.system(cmd)
print duration

Am I doing the output redirect wrong? Or is there simply no way to pipe the terminal output back into python?

like image 529
Gordon Fontenot Avatar asked Mar 15 '10 17:03

Gordon Fontenot


People also ask

How do I save terminal output to a variable?

To store the output of a command in a variable, you can use the shell command substitution feature in the forms below: variable_name=$(command) variable_name=$(command [option ...] arg1 arg2 ...) OR variable_name='command' variable_name='command [option ...] arg1 arg2 ...'


4 Answers

os.system returns a return value indicating the success or failure of the command. It does not return the output from stdout or stderr. To grab the output from stdout (or stderr), use subprocess.Popen.

import subprocess
proc=subprocess.Popen('echo "to stdout"', shell=True, stdout=subprocess.PIPE, )
output=proc.communicate()[0]
print output
like image 58
unutbu Avatar answered Oct 03 '22 08:10

unutbu


Much simplest way

import commands
cmd = "ls -l"
output = commands.getoutput(cmd)
like image 20
Uahmed Avatar answered Oct 03 '22 06:10

Uahmed


You probably want subprocess.Popen.

like image 20
msw Avatar answered Oct 03 '22 06:10

msw


os.system returns the exit code of the executed command, not its output. To do this you would need to use either commands.getoutput (deprecated) or subprocess.Popen:

from subprocess import Popen, PIPE

stdout = Popen('your command here', shell=True, stdout=PIPE).stdout
output = stdout.read()
like image 29
mdeous Avatar answered Oct 03 '22 07:10

mdeous