0

問題は、同じプロセス内で複数のシェルにアクセスする必要があることです。複数のノードに接続できるシステムがあるため、システムでコマンドを実行し、次にノードでコマンドを実行する必要があり、複数のコマンドを送信する必要がある場合があります。別のプロセスを作成せずにノード

たとえば、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: use: not found /bin/sh: go: not found /bin/sh: SELECT: not found

これは、最初のコマンドを実行した後、sybase sql コンソールではなく bash として別のプロセスを作成するため、もちろんコマンドが認識されないためです。どうすればこれを行うことができますか?

4

1 に答える 1

0

対話型コンソールを開くコマンドであるAFAICS とisql、その後のコマンド ( use imhdbgoSELECT) は、そのコンソールに入力するコマンドです

あなたのアプローチは、コマンドごとに個別のプロセスを作成するため、失敗します。

代わりに、最初のコマンドに対してのみサブプロセスを作成してから、3 つの 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()
于 2013-10-22T09:38:29.603 に答える