繁体   English   中英

在subprocess.Popen中使用通配符

[英]Using wildcards in subprocess.Popen

我找到了两个答案,可以解决通过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)

我基本上想获取“视频”文件夹中的任何文件(我的项目从摄像机下载视频,并且每次保存新视频时文件名都会更改),然后合并来自单独“音频”文件夹的音频,然后保存文件到另一个文件夹。

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

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

这里的问题是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相同的错误消息。 显然,在这种情况下,您也可以中止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM