我在尝试使用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与电话相比需要更长时间才能运行。
非常感谢!
答案 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对象,而不是返回代码。