python - 使用 subprocess.Popen() 和手动在 shell 中运行命令之间的区别?
问题描述
import subprocess
ffmpeg_params=['ffmpeg', '-y', '-i', 'http://cache.m.iqiyi.com/mus/235133201/2af150aebb98276a80d52513fb91fbc8/afbe8fd3d73448c9/0/20210115/1f/c5/cda301a0e8339c4cbcc89a4e9a6dafac.m3u8?qd_originate=tmts_py&tvid=1694459300&bossStatus=0&qd_vip=0&px=&src=3_31_312&prv=&previewType=&previewTime=&from=&qd_time=1612598784271&qd_p=6011968c&qd_asc=d0d83b774212c40885a78123935cf7d4&qypid=1694459300_04022000001000000000_4&qd_k=7b1dacf9d318a810bd201e367ef98196&isdol=0&code=2&ff=f4v&iswb=0&qd_s=otv&vf=bb7741a4e27350139427f0051c641530&np_tag=nginx_part_tag', '-c', 'copy', '-bsf:a', 'aac_adtstoasc', '--', 'f:\\/【英语口语】我羡慕你.mp4']
b=subprocess.Popen(ffmpeg_params)
使用这个简单的 .py 脚本,我可以调用 ffmpeg 成功下载视频文件。
但是,如果我运行
ffmpeg -y -i http://cache.m.iqiyi.com/mus/235133201/2af150aebb98276a80d52513fb91fbc8/afbe8fd3d73448c9/0/20210115/1f/c5/cda301a0e8339c4cbcc89a4e9a6dafac.m3u8?qd_originate=tmts_py&tvid=1694459300&bossStatus=0&qd_vip=0&px=&src=3_31_312&prv =&previewType=&previewTime=&from=&qd_time=1612598784271&qd_p=6011968c&qd_asc=d0d83b774212c40885a78123935cf7d4&qypid=1694459300_04022000001000000000_4&qd_k=7b1dacf9d318a810bd201e367ef98196&isdol=0&code=2&ff=f4v&iswb=0&qd_s=otv&vf=bb7741a4e27350139427f0051c641530&np_tag=nginx_part_tag -c copy -bsf:a aac_adtstoasc -- f:/【英语口语】我羡慕你.mp4
在 shell 中,它将失败并显示以下消息:
ffmpeg 版本 N-90173-gfa0c9d69d3 版权所有 (c) 2000-2018 FFmpeg 开发人员使用 gcc 7.3.0 (GCC) 配置构建:--enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora - -enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib - -enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libmfx --enable-amf --enable- cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth libavutil 56. 7.101 / 56. 7.101 libavcodec 58. 13.100 / 58. 13.100 libavformat 58. 10.100 / 58. 10.100 libavdevice 58. 2.100 / 58. 2.100 libavfilter 7. 12.100 / 7. 12.100 libswscale 5. 0.101 / 5. 0.101 libswresample 3. 0.101 / 3. 5. 0.100 1 / 5.0.1001 libpostproc.http://cache.m.iqiyi.com/mus/235133201/2af150aebb98276a80d52513fb91fbc8/afbe8fd3d73448c9/0/20210115/1f/c5/cda301a0e8339c4cbcc89a4e9a6dafac.m3u8?qd_originate=tmts_py : Invalid data found when processing input 'tvid' is not recognized as an内部或外部命令、可运行的程序或批处理文件。'bossStatus' 不是内部或外部命令、可运行程序或批处理文件。
我可以使用 subprocess.Popen 调用 ffmpeg 成功下载视频文件,但是我不能直接在 shell 中以相同的参数运行 ffmpeg 来下载文件。为什么?如何在 shell 中直接运行 ffmpeg 来下载文件?
解决方案
shell 正在解释 URL 中的“&”字符(“tvid”、“bossStatus”等是 URL 中的参数),中断 ffmpeg 命令并尝试启动新命令。使用 subprocess 你没有这个问题,命令和它的参数是安全地分开的。
要在 shell 中运行它,您需要将 URL 括在双引号中:
ffmpeg -y -i "http://cache.m.iqiyi.com/mus/235133201/2af150aebb98276a80d52513fb91fbc8/afbe8fd3d73448c9/0/20210115/1f/c5/cda301a0e8339c4cbcc89a4e9a6dafac.m3u8?qd_originate=tmts_py&tvid=1694459300&bossStatus=0&qd_vip=0&px=&src=3_31_312&prv=&previewType=&previewTime=&from=&qd_time=1612598784271&qd_p=6011968c&qd_asc=d0d83b774212c40885a78123935cf7d4&qypid=1694459300_04022000001000000000_4&qd_k=7b1dacf9d318a810bd201e367ef98196&isdol=0&code=2&ff=f4v&iswb=0&qd_s=otv&vf=bb7741a4e27350139427f0051c641530&np_tag=nginx_part_tag -c copy -bsf:a aac_adtstoasc -- f:/【英语口语】我羡慕你.mp4"
推荐阅读
- html - 使用类名获取元素
- excel - 如何在受保护的工作表上使用代码“.Copy destination:=”
- python - 用python解决一个字符在一个列表中的数学问题
- webpack - 新的“npx create-next-app”应用程序无法编译
- c# - xUnit / Fluent 断言应该().Throw
如果不抛出,则带有消息 - r - 改进 JAGS MCMC 运行时
- c# - 如何在不绑定的情况下按数字分隔文本框的内容?
- python - 如何在某个位置将列从一个数据帧插入/移植到另一个数据帧?
- typescript - 打字稿 - d.ts 文件中的类型未找到
- c# - 对派生类中的重写方法使用基类 Doxygen 注释