выполнение подпроцесса из python - PullRequest
2 голосов
/ 31 мая 2011

Я думаю, что что-то неуловимо искажается, когда я пытаюсь выполнить подпроцесс из скрипта Python

Я пытаюсь выполнить vlc с некоторыми (многими) аргументами.

экземпляр vlc, который возникает, жалуется:

Ваш вход не может быть открыт: VLC не может открыть MRL '-vvv rtsp: //192.168.1.201: 554 / ch0_multicast_one --sout = # transcode {acodec = none}: дубликат {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)

Я проверил вывод функции подпроцесса (используя оболочку), и если я скопирую эту строку в окно cmd, экземпляр vlc работает нормально ... Это привилегия?

Ответы [ 2 ]

2 голосов
/ 31 мая 2011

Поскольку вы передаете список в subprocess.Popen, каждый параметр должен быть в своем элементе own . Итак, вы хотите что-то вроде:

pid = subprocess.Popen([
    "vlc",
    "-vvv",
    "rtsp://%s:554/ch0_multicast_one" % target_nvc.ip_address,
    # etc
], ...)

Каждый параметр (который оболочка обычно для вас анализирует) должен быть в отдельном элементе списка.

Вы также можете передать одну строку командной строки и позволить оболочке разделить ее на части:

pid = subprocess.Popen("vlc -vvv rtsp://...", shell=True, ...)

Использование первой формы лучше для команд, которые имеют много аргументов.

0 голосов
/ 31 мая 2011

Вы должны использовать это ...

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)
...