从python执行子进程

时间:2011-05-31 01:25:00

标签: python subprocess vlc

当我尝试从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实例工作正常......这是特权吗?

2 个答案:

答案 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)