Python Subprocess无法获取oracle命令“imp”的输出

时间:2011-04-08 09:15:55

标签: python oracle

例如:

import subprocess
p=subprocess.Popen("imp -help",stdout=subprocess.PIPE,stdin=subprocess.PIPE)
out,err=p.communicate

out为null

但其他oracle命令如“sqlplus -help”,“rman -help”工作正常

1 个答案:

答案 0 :(得分:1)

为什么你没有在stdout中获得任何输出可能有两个问题:

  1. 该过程将所有输出转储到stderr。
  2. 系统不知道如何执行"imp -help"
  3. 第一个问题的解决方案很简单:使用参数stderr = subprocess.PIPE捕获stderr。

    第二个解决方案也很容易,但解释有点长:子进程不会猜太多,它只会尝试将整个字符串作为一个命令执行。这意味着,在您的情况下,它将尝试执行"imp -help"作为一个命令。它不会尝试使用参数"imp"执行命令"-help"。你必须分别明确告诉subprocess命令和参数。

    来自子进程的python documentation

      

    args应该是一个字符串或一个序列   程序参数。该计划   execute通常是第一项   args序列或字符串如果a   给出了字符串,......

    这意味着您必须将命令和参数分开并按顺序将它们打包在一起。这个:"imp -help"应如下所示:["imp", "-help"]。阅读子进程上的documentation,了解有关拆分命令和参数的复杂性的更多详细信息。

    以下是代码的外观:

    import subprocess
    p=subprocess.Popen(["imp", "-help"],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        stdin=subprocess.PIPE)
    out,err=p.communicate()
    

    注意:您还输入了p.communicate而不是p.communicate()。我认为这是你问题中的拼写错误,而不是你的代码。