[英]Python subprocess calling VLC command
我有以下命令,在 Windows CLI 中可以正常工作:
"G:\VLC\vlc" --dshow-vdev="Video (00 Pro Capture HDMI 4K+)" --dshow-size=1920x1080 -V dummy --intf=dummy --dummy-quiet --video-filter=scene --no-audio --scene-path="C:\<User>\My location" --scene-format=jpeg --scene-prefix=test_file --scene-replace --run-time=1 --scene-ratio=24 "dshow://" vlc://quit
这会拍摄我的采集卡显示的任何内容的快照并将其保存到文件中。 当我像这样尝试使用 Python 时:
import os
import subprocess
path = "C:\\<User>\\My location"
fname = "test_file"
os.chdir('G:\\VLC')
process = subprocess.Popen(['vlc', ' --dshow-vdev="Video (00 Pro Capture HDMI 4K+)"', ' --dshow-size=1920x1080', ' -V dummy', ' --intf=dummy', \
' --dummy-quiet', ' --video-filter=scene', \
' --no-audio' ,path, ' --scene-format=jpeg', ' --scene-prefix=', fname, \
' --scene-replace', ' --run-time=1', ' --scene-ratio=24', ' "dshow://"', ' vlc://quit'])
我在 VLC 日志中得到以下内容,但没有截取屏幕截图:
filesystem error: cannot open file G:\VLC\ --dshow-vdev="Video (00 Pro Capture HDMI 4K+)" (Invalid argument)
dvdnav error: Could not open G:\VLC\ --dshow-vdev="Video (00 Pro Capture HDMI 4K+)" with libdvdcss.
dvdnav error: Can't open G:\VLC\ --dshow-vdev="Video (00 Pro Capture HDMI 4K+)" for reading
dvdnav error: vm: failed to open/read the DVD
谁能向我解释问题是什么?
shlex
可以帮助您解决这类问题。
shlex class 使得为类似于 Unix shell 的简单语法编写词法分析器变得容易。 这对于编写小型语言(例如,在 Python 应用程序的运行控制文件中)或解析带引号的字符串通常很有用。
import shlex
shlex.split(string)
提出以下建议:
['G:\\VLC\\vlc', '--dshow-vdev=Video (00 Pro Capture HDMI 4K+)', '--dshow-size=1920x1080', '-V', 'dummy', '--intf=dummy', '--dummy-quiet', '--video-filter=scene', '--no-audio', '--scene-path=C:\\<User>\\My location', '--scene-format=jpeg', '--scene-prefix=test_file', '--scene-replace', '--run-time=1', '--scene-ratio=24', 'dshow://', 'vlc://quit']
我遇到了同样的问题,但无法用 shlex 解决。 我的代码:
import os
import shlex
import subprocess
cwd = os.getcwd() #working directory: video to be played is stored here
cmd = shlex.split("--random --no-loop") #additional commands for vlc
p = subprocess.Popen(["C:/Program Files/VideoLAN/VLC/vlc.exe", cwd, cmd], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
我也试过:
cmd = '--random --no-loop'
和
cmd = "--random --no-loop"
两者都不起作用。 开始:
vlc.exe --random --no-loop
通过 windows 中的命令提示符可以正常工作。 有没有人知道如何在不使用 *.bat 文件的情况下解决这个问题?
对于之前的误会,我深表歉意。 现在我实际上有一个答案:
我使用以下语法让它工作:
# Play Video without Loop, Random and start Paused
cmd1 = "--random"
cmd2 = "--no-loop"
cmd3 = "--start-paused"
cwd = os.getcwd()
p = subprocess.Popen(["C:/Program Files/VideoLAN/VLC/vlc.exe", cwd, cmd1, cmd2, cmd3], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
如您所见,这些命令在语法中不得包含空格,并且我将字符串分隔在不同的变量中。 此外,对于命令使用 ' 或 " 可能并不重要。这两种方式都有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.