在subprocess.Popen中使用通配符

时间:2017-04-21 21:43:15

标签: python raspberry-pi subprocess wildcard

我找到了几个答案,解决了通过Popen传递通配符的问题,但我似乎无法让这些解决方案适用于我的特定情况。

我有一个项目,当按下按钮时会合并音频和视频文件,我需要使用subprocess.Popen来执行我想要的命令:

mergeFile = "ffmpeg -i /home/pi/Video/* -i /home/pi/Audio/test.wav -acodec copy -vcodec copymap 0:v -map 1:a /home/pi/Test/output.mkv"
proc= subprocess.Popen(shlex.split(mergeFiles), shell=True)

我基本上想要获取我的视频文件夹中的任何文件(我的项目从相机下载视频,并且每次保存新视频时文件的名称都会更改)并合并来自单独的"音频& #34;文件夹,然后将该文件保存到另一个文件夹。

我尝试将shell设置为true,但没有任何效果。

我也不知道glob模块在这种情况下如何帮助我。

1 个答案:

答案 0 :(得分:1)

这里的问题是shlex.split()。与shell=True一起使用时,意味着只将字符串ffmpeg视为脚本,并将命令行的其他组件作为参数传递给该脚本(它从未查看过该脚本) /读取)。

mergeFile = "ffmpeg -i /home/pi/Video/* -i /home/pi/Audio/test.wav -acodec copy -vcodec copymap 0:v -map 1:a /home/pi/Test/output.mkv"
proc = subprocess.Popen(mergeFile, shell=True)

仍然使用shell=True的更好的练习替代方案(如果您实际参数化目录名称和文件名)可能是:

mergeFile=[
    'ffmpeg -i "$1"/* -i "$2" -acodec copy -vcodec copymap 0:v -map 1:a "$3"',
    '_',                          # placeholder for $0
    "/home/pi/Video",             # directory for $1 -- can use a variable here
    "/home/pi/Audio/test.wav",
    "/home/pi/Test/output.mkv",
]
subprocess.Popen(mergeFile, shell=True)

...在这种情况下,脚本本身是常量(并且不能通过文件名或其他参数注入的值改变其含义),但是带外数据可以提供。

更好的是完全停止使用shell=True。考虑:

import subprocess, glob

mergeFile=[
  'ffmpeg', '-i',
] + (glob.glob('/home/pi/Video/*') or ['/home/pi/Video/*']) + [
  '-i', '/home/pi/Audio/test.wav',
  '-acodec', 'copy',
  '-vcodec', 'copymap', '0:v',
  '-map', '1:a1',
  '/home/pi/Test/output.mkv' 
]
subprocess.Popen(mergefile)

如果没有与glob匹配的文件,or ['/home/pi/Video/*']会导致出现与shell相同的错误消息。显然,你也可以在这种情况下中止。