0

问题是我需要在同一个进程中访问多个 shell,因为我有一个可以连接到多个节点的系统我可能需要在系统上执行命令,然后在节点上执行,我需要发送多个命令不创建另一个进程的节点

例如,我编写此代码是为了在我的 solaris 系统上访问 Sybase db(由于某种原因,我无法在我们拥有的 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: 未找到

那是因为在它执行了第一个命令之后,它创建了另一个进程作为 bash 而不是在 sybase sql 控制台中,所以命令当然不能被识别。所以我该怎么做呢?

4

1 回答 1

0

AFAICSisql是打开交互式控制台的命令,随后的命令 ( 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

然后您可以从该子进程的标准输出中获取结果:

print sqlProcess.stdout.read()
于 2013-10-22T09:38:29.603 回答