在python中运行avconv并将stdout / stderr指向文件

时间:2016-02-19 17:19:16

标签: python ubuntu avconv

我希望运行Avconv命令并将日志记录在文件中。在Ubuntu终端中,可以在括号括起来的实际命令之后使用&>>运算符完成。

(avconv -i SRCFILE -ss 00:15:00 -t 00:30:00 TARGETFILE -threads auto) &>> LOGFILE

以上命令在终端中运行时效果很好。

现在我有很多这样的命令可以运行,并且认为通过Python运行它们会很好。

  1. 我尝试使用os.system(command_string)方式 ,运行时没有将Avconv输出打包到LOGFILE,并且avconv命令似乎在Python脚本完成后执行 - 由我输入的一些字符串输出进行调试。我也得到一些许可错误。以下是输出的第一部分如何

    AVCONV COMMAND EXECUTED
    sh: 1: : Permission denied
    sh: 1: : Permission denied
    sh: 1: 
    
    
    PROGRAM DONE
    : Permission denied
    $ avconv version 11.2-6:11.2-1, Copyright (c) 2000-2014 the Libav developers
      built on Jan 18 2015 05:12:33 with gcc 4.9.2 (Ubuntu 4.9.2-10ubuntu2)
    Trailing options were found on the commandline.
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from ...
    
  2. 我也尝试使用subprocess.call()方法,我收到以下错误(注意:所有文件都存在)

    Traceback (most recent call last):
      File "/home/usr/cnv.py", line 61, in <module>
        main()
      File "/home/usr/cnv.py", line 46, in main
        subprocess.call(newcmd)
      File "/usr/lib/python2.7/subprocess.py", line 522, in call
        return Popen(*popenargs, **kwargs).wait()
      File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
        errread, errwrite)
      File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
        raise child_exception
    OSError: [Errno 2] No such file or directory
    
  3. 我希望运行Avconv的多个(50+以上)命令,类似于顶部显示的版本,并将日志保存在文件而不是stdout中。我怎么做 - 用Python或其他方式?

1 个答案:

答案 0 :(得分:0)

试试此代码

from subprocess import Popen, PIPE

FILES = ( 
    ( 'FirstSourceFile.avi', 'FirstDestinationFile.mp4' ),
    ( 'SecondSourceFile.avi', 'SecondDestinationFile.mp4' ),
    #  ... and so on...  
)
log_file = open( 'Logfile.txt', 'w' )

for src_name, dst_name in FILES:
    cmd_list = [ 'avconv', '-i', src_name, '-ss', '00:15:00', '-t', '00:30:00', dst_name, '-threads', 'auto' ]
    p1 = Popen( cmd_list, stdin=PIPE, stdout=PIPE, stderr=PIPE )
    p1out, p1err = p1.communicate()
    if p1out is not None: log_file.write( p1out )
    if p1err is not None: log_file.write( p1err )
log_file.close()