"Invalid argument" 在使用subprocess从python执行命令时。

24 浏览
0 Comments

"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我该如何解决?

0
0 Comments

在使用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']

0