2012-06-22 38 views
1

我有一个Python脚本,需要发出一些shell命令。我想我可以创建一个子进程对象,然后在每次执行命令时重用它。重用子进程对象

这是我如何我的代码设置:

def setupPipeline(self): 
    setupShell = subprocess.Popen([''], stdout=subprocess.PIPE, shell=True, stderr=subprocess.PIPE, stdin=subprocess.PIPE) 

    # Stop running pipeline 
    setupShell.stdin.write('stop ' + self.Name) 
    output = setupShell.stdout.read() 
    print output 

    # Cancel any running jobs and cleanup variables 
    setupShell.stdin.write('sudo -u pr cancel ALL') 
    output = setupShell.stdout.read() 
    print output 

    setupShell.stdin.write('sudo -u pr clean ALL') 
    output = setupShell.stdout.read() 
    print output 

(跳过了这里的许多其他代码)

if __name__ == '__main__': 
#self-test code 
pipelineObj = Pipeline(sys.argv) 
pipelineObj.setupPipeline() 

然而,当代码到达第二个命令,我收到了

IOError: [Errno 32] Broken pipe 

如何重新使用子进程对象发出需要在同一个shell中执行的命令?这些命令不能简单地链接在一起,因为每次调用之间正在进行处理。

+0

(一)你为什么要一遍又一遍地重复使用相同的壳呢? (b)为什么你必须使用shell?您可以简单地[直接使用数组来执行这些命令以将参数拆分](http://docs.python.org/library/subprocess.html#subprocess.Popen) - 并确信PATH也不会IFS环境变量会影响程序的执行。 – sarnold

+0

因为每个命令的结果都需要影响后续命令的shell环境。 –

回答

3

创建一个执行shell的子进程,并向其发送命令。你正在运行一个空命令,它的外壳是,它会导致它执行那个空命令,然后退出。

shell = subprocess.Popen("/bin/bash -i".split(), stdin=subprocess.PIPE, 
         stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

您可能会改为考虑使用pexpect,因为它听起来像你是用自己的方式来重塑它..

+0

我以为我是用“setupShell =”这一行来做的。我想如果我没有发出初始命令,它只会创建一个没有退出的shell进程。 –

+0

不,看看你正在执行的命令是什么:''''。 'shell = True'意味着空命令将在shell中执行,但是执行空命令后shell会继续运行吗?没什么,就是这样。 – kindall

+0

感谢您的反馈和链接。 –