返回从Subprocess调用的bash脚本的代码

时间:2016-10-17 23:20:09

标签: python bash docker

我正在编写一个脚本,将一堆数据导入couchdb数据库,问题是每个db需要大约15分钟,因此我不会看到整个事情,因为我平均需要导入20 db。

脚本循环遍历一个项目数组,然后在每个项目上调用子进程,然后运行导入,然后继续下一步。

我试图通过失败的脚本捕获任何无法正确加载的数据库。 我试图在返回代码不为0时捕获这个,问题是我只能获取调用docker命令的子进程的返回代码,而不是脚本正确执行。

#!/usr/bin/python
import sys
import subprocess

cities = ["x","y", "z"];

uncompletedcities = []
for x in cities:
    dockerscript = "docker exec -it docker_1 ./node_modules/.bin/babel-node --debug --presets es2015 app/exportToCouch %s %s" % (x,x)
    p = subprocess.Popen(dockerscript, shell=True, stderr=subprocess.PIPE)
    error = p.communicate()
    if p.returncode != 0:
            uncompletedcities.append(x)

    while p.poll() == None:
        print p.stderr.read()

print (uncompletedcities)

所以问题是,我收到了

的返回码
p = subprocess.Popen(dockerscript, shell=True, stderr=subprocess.PIPE)

不是这里调用的脚本的返回码

dockerscript = "docker exec -it docker_1 ./node_modules/.bin/babel-node --debug --presets es2015 app/exportToCouch %s %s" % (x,x)

所以从本质上讲,我想更深入地了解返回代码,并获取子进程正在调用的docker命令的返回代码,而不是子进程的返回代码。

所以只需获取此代码的返回码:

docker exec -it docker_1 ./node_modules/.bin/babel-node --debug --presets es2015 app/exportToCouch 

1 个答案:

答案 0 :(得分:0)

请注意,当您运行时:

docker exec -it

你的-it标志正在做一些与你正在尝试的事情相反的事情。您正在尝试打开交互式会话。这实际上正在执行命令。

您可以从命令中删除这两个,然后运行docker exec

dockerscript = "docker exec docker_1 ./node_modules/.bin/babel-node --debug --presets es2015 app/exportToCouch %s %s" % (x,x)

对于它的价值,我也可以考虑使用docker-py。如果您最终只使用几个命令行docker命令,它可以更灵活地运行docker命令。它还可以让您避免使用shell=true