Python 启动带参数的 VLC

Python launching VLC with arguments

我在使用 python 脚本的参数启动 VLC 时遇到问题。我在 Win10 21H1 build 1081 上使用 python 3.9.6。

运行 此命令适用于 cmd.exe,我已将其翻译成 python 代码。

"C:\Program Files\VideoLAN\VLC\vlc.exe" -I dummy 1.m4a --sout="#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst=1.mp3}" vlc://quit

我尝试了两种方法。在方法 1 中,我如下单独发送参数。

import subprocess as objSubProcess
strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"

strCmd = []
strCmd.append(g_strVLCPath)
strLine = "-I dummy " + strFileName
strCmd.append(strLine)
strLine = "--sout=\"#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst="
strLine = strLine + strNewFileName + "}\""
strCmd.append(strLine)
strCmd.append("vlc://quit")

# Run VLC
objSubProcess.run(strCmd)

此代码立即 returns。我的猜测是 VLC 会立即启动并退出。

在方法 2 中,我将所有参数合并为一个,如下所示。

import subprocess as objSubProcess
strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"

strCmd = []
strCmd.append(g_strVLCPath)

strLine = "-I dummy " + "\"" + strFileName + "\" "
strLine = strLine + "--sout=\"#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst="
strLine = strLine + strNewFileName + "}\"" + " vlc://quit"
strCmd.append(strLine)

# Run VLC
objSubProcess.run(strCmd)

此处 VLC 启动(正如我在任务管理器中看到的那样),但我的代码挂起并且 return 即使在很长一段时间后也没有。

在这两种情况下,我都没有得到我想要的 .mp3。

我做错了什么?

首先使用 subprocess.run() 方法的第二个参数为 vlc Subprocess management.

传递参数

subprocess.run() 方法的两个参数很有用:

  1. 如果capture_output为真,stdout和stderr将被捕获。 对故障排除很有用。
  2. 超时参数。如果超时 过期,子进程会被杀死等待

找到解决方案。我将带有所有参数的单个字符串作为简单字符串而不是数组传递。这是对我有用的代码。

import subprocess as objSubProcess
strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"

strLine = "\"" + g_strVLCPath + "\" -I dummy " + strFileName
strLine = strLine + " --sout=\"#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst="
strLine = strLine + strNewFileName + "}\""
strLine = strLine + " vlc://quit"

# Run VLC
objSubProcess.run(strLine)

如果要在列表中传递多个参数,则必须将所有参数分开:

strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"

strCmd = [
    g_strVLCPath,
    "-I",
    "dummy",
    strFileName,
    '--sout="#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst=' + strNewFileName + '}"',
     "vlc://quit"
]

# Run VLC
objSubProcess.run(strCmd)

在 Windows 上,shell=True 总是隐含的,因为 cmd.exe 的工作原理。这意味着 python 会将您的参数 assemble 放入单个命令行并转义或引用空格等内容。这对于理解为什么您的两种方法都不起作用至关重要。如果你想传入一个字符串,你可以直接在 Windows 上进行,但我仍然建议添加 shell=True 以明确你的意图:

strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"

strCmd = f'{g_strVLCPath} -I dummy {strFileName} --sout="#transcode{{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}}:std{{access=file{{no-overwrite}},mux=mp3,dst={strNewFileName}}} vlc://quit'

# Run VLC
objSubProcess.run(strCmd, shell=True)

在您的第一次尝试中,您有一个包含 "-I dummy 1.m4a" 的列表元素。当您将其传递给 shell 时,它将变成字符串 包括 引号,因为您将其指定为包含空格的单个参数,而不是三个单独的参数.

在你的第二次尝试中,你或多或少正确地连接了参数,但没有将程序名称添加到字符串中。由于您传递的是一个列表,python 将用双引号将所有内容括起来并转义其中的所有引号。