2016-10-07 68 views
0

我試圖調用一個包含子進程調用bashscript的python類。子進程調用bash腳本

def downloadURL(self,address): 

     call(['bash youtube2mp3_2.sh', str(address)],shell=True) 

這是bash腳本:

#!/bin/bash 
# Script for grabbing the audio of youtube videos as mp3. 
address=$1 
user_name=$2 # todo 

path_music=/home/pi/music_loaded 

echo Address : $address 

#title=$(youtube-dl --get-title $address) 
youtube-dl --no-playlist -x --audio-format mp3 -o $path_music/'%(title)s.%   (ext)s' $address 
echo ----Download finshed---- 

當調用方法downloadURl我通過一個靜態Youtube鏈接。在python方法中打印他會正確返回。

但腳本中的回聲在consonsole中返回「」。所以我認爲我試圖通過的論據沒有傳遞給腳本。

有沒有人有想法?

+0

除了對可用答案中給出的Python代碼的修復外,該shell腳本確實非常糟糕。考慮通過http://shellcheck.net/運行它並修復它找到的內容。 –

+1

此外,理想情況下,您不應該調用'bash yourscript.sh',而只需調用'yourscript',並讓shebang(在本例中爲'#!/ bin/bash'行)使用什麼樣的解釋器 - 這樣你就可以將程序改寫成完全不同的語言(或者不是一個腳本,而只是一個編譯的二進制文件),而其他調用它的程序不需要知道或關心。 –

回答

2

要麼你傳遞參數作爲一個字符串

def downloadURL(self,address): 
     call('bash youtube2mp3_2.sh '+address) 

或列表

def downloadURL(self,address): 
     call(['bash','youtube2mp3_2.sh',address]) 

都工作,但後者更好,如果必要的,這樣的空間字符被引用。

(順便說一句,因爲你通過bash前綴你的命令,你不需要shell=True

第三種選擇:讓系統選擇使用哪種解釋器根據家當:

def downloadURL(self,address): 
     call(['youtube2mp3_2.sh',address],shell=True) 

PS:你傳遞的參數['bash youtube2mp3_2.sh', str(address)]使call爲第一個引號加上引號,因爲它包含空格,我不知道在Linux上發生了什麼,但是我在Windows上測試過,並且出現了「語法錯誤」,沒有執行任何操作。 (與固定代碼一起工作,我在我的路徑中有MSYS bash

PS2:爲什麼從python調用這樣一個簡單的bash腳本。在Python中執行它:

def downloadURL(self,address): 
    path_music="/home/pi/music_loaded" 
    rc=call(["youtube-dl","--no-playlist","-x","--audio-format","mp3","-o",os.path.join(path_music,'%(title)s.%   (ext)s'),address]) 
    if rc==0: 
     print("Download OK") 
+0

第一個解決方案不會工作。演員陣容只是一個測試,並不是必需的。當刪除shell = true標誌時,我得到以下錯誤:OSError:[Errno 2]沒有這樣的文件或目錄。第二個解決方案只顯示沒有打印沒有日誌。 – Offset

+0

起義。這意味着它甚至找不到'bash'。適用於我。你可以嘗試第三種選擇嗎? –

+0

返回此錯誤::1::youtube2mp3_2.sh:未找到 腳本是否可以在您的系統上運行? – Offset