2017-05-03 35 views
1

我需要在python脚本上运行一个大型的构建脚本(bash命令)。我将它作为一个大字符串接收,并且每行都被\ n分隔。所以,我需要分别执行每一行。我试着用subprocess.Popen()来执行它们。但问题是:在每行之后,进程终止并且所有环境变量都丢失。在python中执行相同进程中的bash命令

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

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

我不想使用这个approuch,因为我想对每次执行有更多的控制权。

有什么办法可以在同一个进程上一个接一个地执行这些命令吗?

任何其他解决方案也不错。

+0

的可能的复制[蟒蛇等待shell命令来完成(http://stackoverflow.com/questions/16196712/python-to-wait-for-shell-command-to-complete) – vv01f

+0

你可以用'subprocess.Popen()'启动一个shell,然后将命令提供给它的标准输入。 – jasonharper

+0

@jasonharper你的意思是从Popen获得输出并直接添加到另一个Popen作为标准输入?但是环境变量呢?我怎么能保留它们? – leandrocastelli

回答

2

你想要的绝对有点奇怪,但它可能使用管道。

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

您可能需要'flush'stdout来确保这个工作正常并且强制'bash'无缓冲地运行,否则你会死锁;即使那样,它也会变得脆弱。您可能需要使用'select'模块和/或线程来确保没有死锁,或者使用第三方'pexpect'模块来实现更多可定制的控制。 – ShadowRanger

0

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

在同一个过程中完成它的唯一可能性是直接模拟python的所有步骤。

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