Python连接子进程

时间:2014-08-25 11:31:19

标签: python subprocess popen shellcode

我正在使用python执行shell命令。它运行正常,但是当我尝试执行多个命令时,它会在不同的进程中执行。 例如:

1. set NAME=XYZ
2. calabash-android run myApp.apk

我正在执行这两个命令,使用以下代码(命令分配给变量bash_cmd):

f_handle = open('test_output.txt','w+')
process = subprocess.Popen(bash_cmd, shell=True, stdout=sys.stdout)
process.wait()            
f_handle.close()

由于每次都会创建不同的进程,因此无法访问上一个命令中设置的NAME。我可以写一个批处理文件,但是变量NAME的值也会动态变化。我希望这两个命令在同一个进程中执行。

有没有办法在python中批处理这些命令,或者可能加入子进程。请帮忙!!

2 个答案:

答案 0 :(得分:1)

每个subprocess.Popen都会创建一个新流程。如果你想在同一个shell中执行几个命令,那么你可以一次性传递它们:

from subprocess import check_call

check_call("\n".join(shell_commands), shell=True)

你也可以启动一个shell进程并通过它的stdin逐个提供命令:

from subprocess import Popen, PIPE

shell = Popen("/bin/sh", stdin=PIPE, bufsize=1)
for shell_command in iter(commands_queue.get, None):
    print >>shell.stdin, shell_command # write command
shell.stdin.close()
if shell.wait() != 0:
    raise RuntimeError(shell.returncode)

在您的特定情况下,您可以将修改后的环境直接传递给子流程:

import os
from subprocess import check_call

env = os.environ.copy()
env['NAME'] = 'XYZ'
check_call(["calabash-android", "run", "myApp.apk"], env=env)

答案 1 :(得分:0)

您可以一次性完成此操作:

  1. NAME = XYZ calabash-android运行myApp.apk