subprocess.Popen()访问拒绝解决办法

  • Post author:
  • Post category:其他


代码:

def fullVideoProc(filename, output_dir, sec_idx, end_idx, allFrames = True, framesPerSec = 1):
    if allFrames == True:
        # 这个命令行就是上面介绍的
        command = [ffmpeg_path,"-y","-i",filename, "-ss", str(sec_idx), "-t", str(end_idx), "-q:v", "2", "-f",
                   "image2",output_dir+"%6d.jpg"]
    else:
        # 这个命令行多了一个-r,传入的framesPerSec值是1,目的是每秒只取一帧画面,可以加速处理,但是由于抛弃了很多帧画面,结果会有遗漏
        command = [ffmpeg_path, "-y", "-i", filename, "-ss", str(sec_idx), "-t", str(end_idx), "-r", str(framesPerSec), "-q:v", "2", "-f",
                   "image2", output_dir + "%6d.jpg"]
    # 执行命令行
    result = subprocess.Popen(command,shell=False,stdout = subprocess.PIPE, stderr = subprocess.STDOUT)

    #result = subprocess.call(command,shell=False,stdout = subprocess.PIPE, stderr = subprocess.STDOUT)

报错:

原因:

shell=True参数会让subprocess.call(Popen)接受字符串类型的变量作为命令,并调用shell去执行这个字符串,当shell=False是,subprocess.call(Popen)只接受数组变量作为命令,并将数组的第一个元素作为命令,剩下的全部作为该命令的参数。

为True或者False的区别可以自行百度。

解决办法:

将shell=False改为shell=True

重跑结果:

也许你会说,shell=True 不是很好吗,执行两个命令就是我期望的呀。但其实,这种做法是不安全的,因为多个命令用分号隔开,万一检查不够仔细,执行了危险的命令比如 rm -rf / 这种那后果会非常严重,而使用shell=False就可以避免这种风险。

总体来说,看实际需要而定,官方的推荐是尽量不要设置shell=True。




版权声明:本文为Joyyang_c原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。