从Popen调用unix命令时处理错误

2024-03-29 08:45:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用以下方法测试bcunix命令。。。它接受一个表达式,执行它并收回输出。。。你知道吗

def run_test(expr=""):

        try:
            process = sp.Popen('bc',
                               stdin=sp.PIPE,
                               stdout=sp.PIPE,
                               stderr=sp.PIPE)
            process.stdin.write(expr)
            result = process.stdout.readline()
            process.stdin.close()
            retval = process.wait()
            return result
        except Exception, e:
            print e


# correct expression, returns '4'
print run_test('2+2\n') 

但是,当我传递一个错误的表达式expr时,我希望正确地处理错误,这样我就可以断言该expr的测试用例正确地失败了。。。你知道吗

#never stops
print run_test('2 / 0\n')

但是,上面的表达式永远不会返回。。。我想返回一个值,例如false,它会告诉我表达式无效,然后当我断言时

assertTrue(run_test('2 / 0\n'), False) 

会正常工作。。。我怎样才能做到呢?你知道吗


Tags: 方法runtest命令表达式stdinstdout断言
2条回答
  1. 你最好的办法就是用python做一些事情 程序永远不能保证返回合理的东西。

  2. 下一个最好的方法是避免在交互模式下调用程序,但是 仅在命令行模式下。

  3. 之后,您可以尝试始终为正在调用的程序附加出口,例如对于bc useprocess.stdin.write(expr + "\nquit\n")

  4. 最后也是最坏的情况是启动一个计时器,如果表达式在计时器过期之前没有终止,则终止进程并给出超时错误。

发生的事情是stderr没有被正确重定向。在执行readline时,需要通过python提示符中的以下命令将stderr重定向到stdout。你需要把它移到你的功能上。你知道吗

   def run_test(expr=""):

        try:
            process = sp.Popen('bc',
                               stdin=sp.PIPE,
                               stdout=sp.PIPE,
                               stderr=sp.STDOUT)
            process.stdin.write(expr)
            result = process.stdout.readline()
            process.stdin.close()
            retval = process.wait()
            return result
        except Exception, e:
            print e


# correct expression, returns '4'
print run_test('2+2\n') 

print run_test('2 / 0\n') # now this stops too

医生说:http://docs.python.org/2/library/subprocess.html 一个特殊值,可用作Popen的stderr参数,并指示标准错误应与标准输出进入同一句柄。你知道吗

相关问题 更多 >