当我尝试从python脚本执行子进程时,我认为有些东西正在巧妙地变换
我试图用一些(很多)参数执行vlc。
出现的vlc实例抱怨:
您的输入无法打开: VLC无法打开MRL'-vvv rtsp://192.168.1.201:554 / ch0_multicast_one --sout = #transcode {acodec = none}:duplicate {dst = rtp {sdp = rtsp://:5544 / user_hash。 sdp},dst = display}:no-sout-rtp-sap:no-sout-standard-sap:ttl = 1:sout-keep'。查看日志以获取详细信息。
这是python代码
pid = subprocess.Popen(["vlc "," -vvv rtsp://%s" % target_nvc.ip_address + ":554/ch0_multicast_one --sout=#transcode{acodec=none}:duplicate{dst=rtp{sdp=rtsp://:5544/user_hash.sdp},dst=display} :no-sout-rtp-sap :no-sout-standard-sap :ttl=1 :sout-keep" ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
我已经检查了子进程函数的输出(使用shell),如果我将该字符串粘贴到我的cmd窗口中,那么vlc实例工作正常......这是特权吗?
答案 0 :(得分:2)
由于您将列表传递给subprocess.Popen
,因此每个参数都必须位于拥有元素中。所以你想要的东西是:
pid = subprocess.Popen([
"vlc",
"-vvv",
"rtsp://%s:554/ch0_multicast_one" % target_nvc.ip_address,
# etc
], ...)
每个参数(shell通常会为您解析)必须位于单独的列表元素中。
您还可以传递一个命令行字符串,让shell将其拉开:
pid = subprocess.Popen("vlc -vvv rtsp://...", shell=True, ...)
对于有大量参数的命令,使用第一种形式更好。
答案 1 :(得分:0)
你应该使用这个......
pid = subprocess.Popen(["vlc", "-vvv",
"rtsp://%s" % target_nvc.ip_address + ":554/ch0_multicast_one",
"--sout=#transcode{acodec=none}:duplicate{dst=rtp{sdp=rtsp://:5544/user_hash.sdp},dst=display}",
":no-sout-rtp-sap", ":no-sout-standard-sap",
":ttl=1", ":sout-keep" ], stdout=subprocess.PIPE,
stderr=subprocess.PIPE, stdin=subprocess.PIPE)