问题是我需要在同一进程中访问多个shell,因为我有一个可以连接到多个节点的系统,我可能需要在系统上执行命令然后在节点上我需要发送节点上的多个命令,而不创建另一个进程
我编写了这段代码,例如在我的solaris系统上访问Sybase数据库(出于某种原因,我无法在我们的Python 2.6版本上安装Sybase模块)
cmd1 = 'isql -Usa -w1024 -P********'
cmd2 = 'use imhdb'
cmd3 = 'go'
cmd4 = "SELECT Id_number, Object_name FROM IM_top WHERE Object_name LIKE'%BtsSiteMgr=CAI3533%'"
final = Popen("{0}; {1}; {2}; {3}".format(cmd1, cmd2, cmd3,cmd4),shell=True,stdin=PIPE,stdout=PIPE, stderr=STDOUT, close_fds=True)
stdout, nothing = final.communicate()
print(stdout)
输出: / bin / sh:使用:未找到 / bin / sh:go:找不到 / bin / sh:SELECT:not found
那是因为在它执行了第一个命令之后,它创建了另一个进程,而不是在sybase sql控制台中进行bash,所以命令occourse不被识别。那我怎么能这样做呢?
答案 0 :(得分:0)
AFAICS isql
是打开交互式控制台的命令,后续命令(use imhdb
,go
,SELECT
)是要输入的命令在控制台中。
您的方法将为每个命令创建一个单独的进程,从而失败。
您应该只为第一个命令创建一个子流程,然后将三个与SQL相关的命令传输到现有的子流程中:
sqlProcess = Popen(cmd1, shell='True', stdin=PIPE, stdout=PIPE, stderr=PIPE)
print >>sqlProcess.stdin, cmd2
print >>sqlProcess.stdin, cmd3
print >>sqlProcess.stdin, cmd4
sqlProcess.stdin.close() # signal end of input
然后你可以从该子进程的stdout中获取结果:
print sqlProcess.stdout.read()