2016-10-07 3 views
0

Im пытается вызвать класс python, который содержит вызов подпроцесса для bashscript.Сценарий вызова bash подпроцесса

def downloadURL(self,address): 

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

Это Баш скрипт:

#!/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 вернет его правильно.

Но эхо в скрипте вернется в консоль. Поэтому я думаю, что аргумент, который я пытаюсь передать, не передается скрипту.

У кого-нибудь есть идея?

+0

В дополнение к исправлениям для кода Python, указанным в доступном ответе, этот сценарий оболочки действительно ужасен. Попробуйте запустить его через 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]) 

обе работы, но последний лучше так космические символы указаны при необходимости.

(BTW, так как вы префикс вашей команды на bash вам не нужно shell=True)

Третий вариант: пусть система выбрать интерпретатор использовать в соответствии с притон:

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

PS: Аргоны, которые вы передаете ['bash youtube2mp3_2.sh', str(address)] make call, добавьте кавычки к первому, потому что он содержит пробелы, ну, я не знаю, что, черт возьми, происходит в Linux, но я тестировал на windows и получил «синтаксическую ошибку», ничего не было выполнено , (Работает с фиксированным кодом, у меня MSYS bash на моем пути)

PS2: зачем вызывать такой простой скрипт bash из python. Сделайте это в 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

первое решение не работает. str str была просто испытанием и не нужна. При удалении оболочки = true флаг я получил следующую ошибку: OSError: [Errno 2] Нет такого файла или каталога. Второе решение просто не показывает никаких отпечатков, никаких журналов вообще. – Offset

+0

Suprising. Это означает, что он даже не находит 'bash'. Работает на меня. Можете ли вы попробовать третий вариант? –

+0

Вернуть эту ошибку:: 1:: youtube2mp3_2.sh: не найден Работает ли скрипт в вашей системе? – Offset

Смежные вопросы