簡體   English   中英

從 python 執行子進程

[英]executing a subprocess from python

當我嘗試從 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)

我已經檢查了 subprocess 函數的輸出(使用 shell),如果我將該字符串復制粘貼到我的 cmd 窗口中,vlc 實例工作正常......這是特權嗎?

由於您將列表傳遞給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, ...)

對於有很多參數的命令,使用第一種形式更好。

你應該用這個...

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)
movies_path = glob.glob("D:\\MOVIES\**\*\*\*.mp4", recursive=True) + \
          glob.glob("D:\\MOVIES\**\*\*\*.mkv", recursive=True) + \
          glob.glob("D:\\MOVIES\**\*\*\*.avi", recursive=True)

可能是正確的電影

rightMoviePath = difflib.get_close_matches(which_movie, movies_path, len(movies_path), 0) movie_name = rightMoviePath[0].split("\")[-1] hebrew_subtitle_path = glob.glob(rightMoviePath[0].replace(movie_name, " Hebrew.srt"))[0] english_subtitle_path = glob.glob(rightMoviePath[0].replace(movie_name, "English.srt"))[0]

process, player = subprocess.Popen(["C:\Users\yonat\Downloads\VLC\vlc.exe", "--sub-file", hebrew_subtitle_path, rightMoviePath[0]], stdin=subprocess.PIPE, stdout=子進程.PIPE, stderr=子進程.PIPE)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM