如何确保脚本仅在subprocess.Popen完成执行后执行后续方法

时间:2014-10-13 02:53:21

标签: python python-2.7 subprocess call popen

我在尝试使用subprocess.Popen时遇到了一些问题。我不能将subprocess.Call用于我正在编写的脚本,因为我希望能够为我的执行指定环境,我只能通过该方法的参数在Popen中执行此操作。我注意到subprocess.Popen需要更长的时间才能完成subprocess.Call,这会在我的脚本中产生下游问题,因为我的脚本的其余部分依赖于生成进程的退出代码(返回代码)来决定(通过集合)关于适当行动的条件性If语句。

涉及使用Subprocess的方法是:

def execute_local(self):
'''
Spawns a test execution process locally and directs the standard output and 
error streams from the process to the appropriate log files.  
'''
self.return_code = subprocess.Popen(args = self.cmd_string, 
                                   stdout = open(self.out_log_filepath, 'w'),
                                   stderr = open(self.err_log_filepath, 'w'), 
                                   shell = True)

我还没有指定env参数,因为在我继续前进之前我需要确保它有效。

包含条件的后续方法是:

def get_status(self):
'''
Returns a string named either passed or failed back to itself, depending on 
exit status of the process that was spawned in the execute_local method.

This is important for main.py to be able to examine the status of the test 
processes and take appropriate administrative actions to either continue to 
a new test step or retry a give test.
'''
print self.return_code
if self.return_code == 0:
  return 'passed'
else:
  return 'failed'

在更高级别的模块中,将按以下顺序调用方法:execute_local ---后跟----> GET_STATUS。

以前当我通过电话执行此操作时,执行顺利进入条件,但现在与Popen一起,它没有。当我尝试使用print语句调试打印出子进程生成的进程的返回代码时(我在get_status方法中添加了一个print self.return_code语句,如下所示),我观察到通过调用,我实际得到返回代码,但是对于Popen,我得到的只是对象本身及其内存地址。

我非常感谢任何有关这方面的帮助,也有人可以向我解释为什么Popen与电话相比需要更长时间才能运行。

非常感谢!

1 个答案:

答案 0 :(得分:1)

subprocess.call只是Popen的包装器,它等待被调用的进程退出。它采用与Popen相同的参数,并且可以替换(错误实现的)Popen并将其替换为call以获得您想要的内容。

self.return_code = subprocess.call(args = self.cmd_string, 
                                   stdout = open(self.out_log_filepath, 'w'),
                                   stderr = open(self.err_log_filepath, 'w'), 
                                   shell = True,
                                   env=my_env)

在当前的实现中,您将返回Popen对象,而不是返回代码。