Python Subprocess无法获取oracle命令“imp”的输出
举个例子:
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)看到任何结果,可能有两个原因:
- 程序把所有的输出都扔到了错误输出(stderr)里。
- 系统不知道怎么执行
"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()
。我猜这只是你提问时的一个打字错误,而不是你代码里的错误。