在python中的同一进程中执行bash命令

时间:2017-05-03 21:05:43

标签: python python-2.7 subprocess

我需要在python脚本上运行一个大型构建脚本(bash命令)。我将它作为一个大字符串接收,每行由\ n分割。所以,我需要分别执行每一行。

首先,我尝试使用subprocess.Popen()来执行它们。但问题是:在每一行之后,进程终止并且所有环境变量都丢失。

问题不是等待命令完成另一个命令,我需要在同一个shell上执行所有命令。

到目前为止,我发现的唯一解决方案是将所有命令保存为sh文件(例如build.sh)并在python上执行。

我不想使用此approuch,因为我希望能够更好地控制每次执行。

有没有办法在同一个进程上逐个执行这些命令?

任何其他解决方案都会很好。

2 个答案:

答案 0 :(得分:3)

你想要的绝对有点奇怪,但可以使用烟斗。

from subprocess import PIPE, Popen

p = Popen(['bash'], stdin=PIPE, stdout=PIPE)
p.stdin.write('echo hello world\n')
print(p.stdout.readline())
# Check a return code
p.stdin.write('echo $?\n')
if p.stdout.readline().strip() ⩵ '0':
    print("Command succeeded")
p.stdin.write('echo bye world\n')
# Close input and wait for bash to exit
stdout, stderr = p.communicate()
print(stdout)

答案 1 :(得分:0)

调用shell时,os会启动一个新进程,除非你在python中有一个shell解释器。

在同一个过程中执行此操作的唯一可能性是直接使用python模拟所有步骤。

更好的方法是接受限制,自己调用外部进程并等待脚本终止受控制。例如是例如在这里:python to wait for shell command to complete