在Pythonsubprocess中的Docker中运行交互式命令
当我在交互模式下使用docker run时,我能够运行我想testing一些python的命令。
root@pydock:~# docker run -i -t dockerfile/python /bin/bash [ root@197306c1b256:/data ]$ python -c "print 'hi there'" hi there [ root@197306c1b256:/data ]$ exit exit root@pydock:~#
我想从Python使用subprocess模块自动化,所以我写了这个:
run_this = "print('hi')" random_name = ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(20)) command = 'docker run -i -t --name="%s" dockerfile/python /bin/bash' % random_name subprocess.call([command],shell=True,stderr=subprocess.STDOUT) command = 'cat <<\'PYSTUFF\' | timeout 0.5 python | head -n 500000 \n%s\nPYSTUFF' % run_this output = subprocess.check_output([command],shell=True,stderr=subprocess.STDOUT) command = 'exit' subprocess.call([command],shell=True,stderr=subprocess.STDOUT) command = 'docker ps -a | grep "%s" | awk "{print $1}" | xargs --no-run-if-empty docker rm -f' % random_name subprocess.call([command],shell=True,stderr=subprocess.STDOUT)
这应该创build容器,在容器上运行python命令并退出并移除容器。 它执行所有这些操作,除了命令在主机上运行而不是在Docker容器上运行。 我猜Docker正在切换shell或类似的东西。 如何从一个新的shell运行pythonsubprocess?
你实际上需要在你正在打开的新shell上产生一个新的子。所以在docker creation
运行pexpect
docker enter
或者用pexpect
而不是子pexpect
尝试相同的操作pexpect
产生一个新的子pexpect
,这样你就可以发送命令了。
它看起来像你期待第二个命令cat <<...
发送input到第一个命令。 但是这两个subprocess命令没有任何关系,所以这是行不通的。
Python的subprocess
popen
库以及作为其基础的popen
命令提供了一种方法来获取pipe道到进程的标准input。 这样,您可以直接从Python发送所需的命令,而不必尝试让另一个subprocess与其通信。
所以,像这样的:
from subprocess import Popen, PIPE p = Popen("docker run -i -t --name="%s" dockerfile/python /bin/bash", stdin=PIPE) p.communicate("timeout 0.5 python | head -n 500000 \n" % run_this)
(我不是一个Python专家;对string形成的错误表示歉意。