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

1 投票
1 回答
903 浏览
提问于 2025-04-16 15:20

举个例子:

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

结果是 null

不过其他的Oracle命令,比如 "sqlplus -help" 和 "rman -help" 都能正常工作

1 个回答

1

你没有在标准输出(stdout)看到任何结果,可能有两个原因:

  1. 程序把所有的输出都扔到了错误输出(stderr)里。
  2. 系统不知道怎么执行 "imp -help" 这个命令。

第一个问题的解决办法很简单:使用参数 stderr = subprocess.PIPE 来捕获错误输出。

第二个问题的解决办法也不复杂,但解释起来稍微长一点:子进程(subprocess)不会自己猜,它只是把整个字符串当作一个命令来执行。这意味着,在你的情况下,它会把 "imp -help" 当作一个命令来执行,而不是把 "imp" 当作命令,把 "-help" 当作参数。你需要明确告诉子进程命令和参数是分开的。

根据Python的文档,关于子进程的说明是:

args应该是一个字符串,或者是一系列程序参数。要执行的程序通常是args序列中的第一个项目,或者如果给的是字符串,则就是这个字符串,...

这意味着你需要把命令和参数分开,并把它们放在一个序列里。像 "imp -help" 这样的命令应该变成 ["imp", "-help"]。想了解更多关于如何分开命令和参数的细节,可以查看文档

下面是代码应该长的样子:

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

注意:你输入了 p.communicate 而不是 p.communicate()。我猜这只是你提问时的一个打字错误,而不是你代码里的错误。

撰写回答