"Invalid argument" 在使用subprocess从python执行命令时。
"Invalid argument" 在使用subprocess从python执行命令时。
我想从Python中执行一个命令。这是原始命令:\n
yt-dlp -f bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best --downloader ffmpeg --downloader-args "ffmpeg_i:-ss 00:19:10.00 -to 00:19:40.00" --no-check-certificate https://youtu.be/YXfnjrbmKiQ
\n所以我这样做:\n
import subprocess result = subprocess.call(['yt-dlp','-f','bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best','--downloader','ffmpeg','--downloader-args','"ffmpeg_i:-ss 00:00:10.00 -to 00:00:40.00"','--no-check-certificate','https://youtu.be/YXfnjrbmKiQ']) print(result)
\n但是它给我报错:\n
ffmpeg_i:-ss 00:00:10.00 -to 00:00:40.00: 无效参数
\n我该如何解决?
在使用subprocess模块的call方法执行命令时,出现了"Invalid argument"的错误。根据给出的代码和解释,可以得出以下原因和解决方法:
原因:
在不使用shell=True的情况下,不需要在命令的各个元素中使用双引号(" "),因为通常只有shell需要它来识别哪些元素作为一个字符串保留下来,但是后续shell会将此字符串发送到系统时不包含双引号。
解决方法:
1. 在不使用shell=True的情况下,将命令的各个元素作为列表传递给subprocess.call方法,并且不需要使用双引号。例如:
import subprocess result = subprocess.call([ 'yt-dlp', '-f', 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' '--downloader', 'ffmpeg' '--downloader-args', 'ffmpeg_i:-ss 00:19:10.00 -to 00:19:40.00' '--no-check-certificate', 'https://youtu.be/YXfnjrbmKiQ' ]) print(result)
2. 在使用shell=True的情况下,需要将整个命令作为一个字符串传递给subprocess.call方法,并且需要使用双引号。例如:
import subprocess result = subprocess.call( 'yt-dlp -f bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best --downloader ffmpeg --downloader-args "ffmpeg_i:-ss 00:19:10.00 -to 00:19:40.00" --no-check-certificate https://youtu.be/YXfnjrbmKiQ', shell=True ) print(result)
此外,还可以使用标准模块shlex的split方法将带有命令的字符串转换为参数列表,可以方便地将命令字符串拆分为各个元素。例如:
import shlex cmd = 'yt-dlp -f bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best --downloader ffmpeg --downloader-args "ffmpeg_i:-ss 00:19:10.00 -to 00:19:40.00" --no-check-certificate https://youtu.be/YXfnjrbmKiQ' cmd = shlex.split(cmd) print(cmd)
输出结果显示没有双引号的元素:
['yt-dlp', '-f', 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best', '--downloader', 'ffmpeg', '--downloader-args', 'ffmpeg_i:-ss 00:19:10.00 -to 00:19:40.00', '--no-check-certificate', 'https://youtu.be/YXfnjrbmKiQ']