在python中运行avconv并将stdout/stderr定向到一个文件

在python中运行avconv并将stdout/stderr定向到一个文件,python,ubuntu,avconv,Python,Ubuntu,Avconv,我希望运行Avconv命令并将日志记录在一个文件中。在Ubuntu终端中,这可以在括号中的实际命令之后使用&>操作符来完成,即 (avconv -i SRCFILE -ss 00:15:00 -t 00:30:00 TARGETFILE -threads auto) &>> LOGFILE 在终端中运行时,上述命令工作正常 现在我有很多这样的命令要运行,我认为通过Python运行它们会很好 我尝试使用os.system(命令字符串)方式 ,它在运行时不会将Avconv输出打

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

(avconv -i SRCFILE -ss 00:15:00 -t 00:30:00 TARGETFILE -threads auto) &>> LOGFILE
在终端中运行时,上述命令工作正常

现在我有很多这样的命令要运行,我认为通过Python运行它们会很好

  • 我尝试使用
    os.system(命令字符串)
    方式 ,它在运行时不会将Avconv输出打包到日志文件,并且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 ...
    
  • 我还尝试使用
    subprocess.call()
    方法,我得到以下错误(注意:所有文件都存在)

    回溯(最近一次呼叫最后一次):
    文件“/home/usr/cnv.py”,第61行,在
    main()
    文件“/home/usr/cnv.py”,第46行,主
    子进程调用(newcmd)
    文件“/usr/lib/python2.7/subprocess.py”,第522行,在调用中
    返回Popen(*popenargs,**kwargs)。等待()
    文件“/usr/lib/python2.7/subprocess.py”,第710行,在__
    错误读取,错误写入)
    文件“/usr/lib/python2.7/subprocess.py”,第1335行,在执行子进程中
    引发子对象异常
    OSError:[Errno 2]没有这样的文件或目录
    
  • 我希望运行多个Avconv命令(想想50+),类似于顶部显示的版本,并将日志保存在文件中,而不是stdout中。我如何做到这一点?用Python还是其他语言?

    试试这段代码

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