Python subprocess.check_调用给出返回的错误非零退出状态1

Python subprocess.check_调用给出返回的错误非零退出状态1,python,bash,Python,Bash,我有一个bash脚本,它在Python脚本的末尾被调用。如果我用一个简单的Python脚本(下面的test.py)手动调用该脚本,它就可以正常工作。然而,当从我的实际脚本(long.py)调用时,它失败了。因此long.py运行,在末尾调用rename.sh,并向其传递一个linux目录路径source\u dirrename.sh重命名所述路径中的文件。以下是该脚本的相关摘录: long.py PATH = '/var/bigbluebutton/published/presentation

我有一个bash脚本,它在Python脚本的末尾被调用。如果我用一个简单的Python脚本(下面的test.py)手动调用该脚本,它就可以正常工作。然而,当从我的实际脚本(long.py)调用时,它失败了。因此
long.py
运行,在末尾调用
rename.sh
,并向其传递一个linux目录路径source\u dir
rename.sh
重命名所述路径中的文件。以下是该脚本的相关摘录:

long.py

PATH = '/var/bigbluebutton/published/presentation/'
LOGS = '/var/log/bigbluebutton/download/'
source_dir = PATH + meetingId + "/"

...

def main():

...

    try:
        create_slideshow(dictionary, length, slideshow, bbb_version)
        ffmpeg.trim_audio_start(dictionary, length, audio, audio_trimmed)
        ffmpeg.mux_slideshow_audio(slideshow, audio_trimmed, result)
        serve_webcams()
        # zipdir('./download/')
        copy_mp4(result, source_dir + meetingId + '.mp4')

    finally:
        print >> sys.stderr, source_dir

        #PROBLEM LINE
        subprocess.check_call(["/scripts/./rename.sh", str(source_dir)])

        print >> sys.stderr, "Cleaning up temp files..."
        cleanup()
        print >> sys.stderr, "Done"

if __name__ == "__main__":
    main()
问题是:

long.py
使用上述行调用
rename.sh

subprocess.check_call(["/scripts/./rename.sh", str(source_dir)])
它给出了错误:

subprocess.CalledProcessError: Command '['/scripts/./rename.sh', '/var/bigbluebutton/published/presentation/5b64bdbe09fdefcc3004c987f22f163ca846f1ea-1574708322765/']' returned non-zero exit status 1
否则,脚本工作得很好

test.py是long.py的缩短版本,仅包含以下两行:

test.py

source_dir = '/var/bigbluebutton/published/presentation/5b64bdbe09fdefcc3004c987f22f163ca846f1ea-1574708322765/'
subprocess.check_call(["/scripts/./rename.sh", str(source_dir)])
当使用python test.py运行时,它不会遇到错误

以下是rename.sh的内容:

rename.sh

#/bin/bash
i=$1
a=$(grep'$i/metadata.xml | sed-e's/\(.*)/\1/'| tr-d')
b=$(grep'$i/metadata.xml | sed-e's/\(.*)/\1/'| tr-d')
c=$(ls-alF$i/*.mp4 | awk'{gsub(“:”,“|”);print$6“-$7“-$8}”)
d=$(echo$b)$(echo$c).mp4
cp$i/*.mp4/root/mp4s/$d
test.py
long.py
位于同一位置

我没有手动执行
long.py
;它被另一个程序执行

print >> sys.stderr, source_dir

确认与我在test.py中显式定义的完全相同的值被long.py传递到rename.sh

为什么要编写
d=$(echo$b)$(echo$c).mp4
而不是
d=“${b}{u${c}.mp4
?前者的速度实际上慢了数百倍,更不用说因为命令替换中的无引号扩展将
$b
$c
扩展为globs(将
*
更改为当前目录中的文件列表f/e)。无论如何,错误消息只是说脚本运行的最后一个程序(可能是
cp
)返回一个错误。shell传播该错误,因此Python代码接收它。考虑运行shell脚本。不要使用<代码> GRP和<代码> SED解析XML——特别是当从Python代码调用时,它有一个真正的XML解析器,并且可以更可靠地完成该任务。(因此您可以将
a
b
等作为参数传入)并将
set-x
添加到shell脚本(在shebang之后)要让它记录它运行的命令,以便更好地检测它失败的原因……也就是说,提出堆栈溢出问题的时间是在您分离出导致狭窄、特定问题的最短可能的代码,并构建其他人可以运行的最短可能的复制器,以查看问题本身并测试建议的答案之后(如帮助中心中的定义所述)。由于这需要除您以外的任何人都没有的文件,因此它根本不是其他人可以运行的复制程序。
rename.sh
可能可以用Python重新编写-这将使调试变得更容易,并且不需要任何子流程例程。您究竟为什么要编写
d=$(echo$b)$(echo$c).mp4
而不是
d=“${b}}{c}.mp4
?前者实际上要慢几百倍,更不用说马车了,因为命令替换中的无引号扩展将
$b
$c
扩展为全局(将
*
更改为当前目录中的文件列表f/e)。无论如何,错误消息只是说脚本运行的最后一个程序(可能是
cp
)返回一个错误。shell传播该错误,因此Python代码接收它。考虑运行shell脚本。不要使用<代码> GRP和<代码> SED解析XML——特别是当从Python代码调用时,它有一个真正的XML解析器,并且可以更可靠地完成该任务。(因此您可以将
a
b
等作为参数传入)并将
set-x
添加到shell脚本(在shebang之后)要让它记录它运行的命令,以便更好地检测它失败的原因……也就是说,提出堆栈溢出问题的时间是在您分离出导致狭窄、特定问题的最短可能的代码,并构建其他人可以运行的最短可能的复制器,以查看问题本身并测试建议的答案之后(如帮助中心中的定义所述)。由于这需要除您以外的任何人都没有的文件,因此它根本不是其他人可以运行的复制程序。
rename.sh
可能可以用Python重新编写-这将使调试变得更容易,并且不需要任何子流程例程。