例如:
import subprocess
p=subprocess.Popen("imp -help",stdout=subprocess.PIPE,stdin=subprocess.PIPE)
out,err=p.communicate
out为null
但其他oracle命令如“sqlplus -help
”,“rman -help
”工作正常
答案 0 :(得分:1)
为什么你没有在stdout中获得任何输出可能有两个问题:
"imp -help"
。第一个问题的解决方案很简单:使用参数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()
。我认为这是你问题中的拼写错误,而不是你的代码。