子进程调用 bash 脚本

Subprocess call bash script

我正在尝试调用 python class,其中包含对 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=
user_name= # 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 link。在 python 方法中打印他 return 正确。

但是脚本中的回显return“”在控制台中。所以我认为我试图传递的参数没有传递给脚本。

有人有想法吗?

要么将参数作为字符串传递

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

或作为列表

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

两者都有效,但后者更好,因此 space 必要时会引用字符。

(顺便说一句,因为您在命令前加上 bash,所以您不需要 shell=True

第三种选择:让系统根据shebang选择使用哪个解释器:

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

PS:您传递的参数 ['bash youtube2mp3_2.sh', str(address)] 使 call 添加引号到第一个,因为它包含 spaces,我不知道Linux 上到底发生了什么,但我在 windows 上进行了测试,我得到了一个 "syntax error",没有执行任何操作。 (使用固定代码,我的路径中有 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")