0

コンソールウィンドウが1つしか開かれていないため、Python 3で新しいプロセスを作成して、「同じセッション」で複数のコマンドを実行しようとしています。何かがメモリに格納されているDB2 LUWデータベースに関連するものです。次のコードで「winshell.py」というファイルを作成しました。

import sys
import subprocess

def shell_execute(cmd, filename=""):
    '''
    Executes a command on SO and returns STDOUT and STDERR to a variable.
    If filename is used, then write STDOUT and STDERR to a file.

    '''

    try:
        output = subprocess.check_output(cmd, shell=True)
        str = output.decode("1252")
        str = str.replace("\r","")    

        if filename:
            file = open(filename, "a")
            file.write(str)
            file.close()
            return "Output sent to file: "+filename
        else:
            return str

    except subprocess.CalledProcessError as cpe:
        str = cpe.output.decode("1252")
        if filename:
            file = open(filename, "a")
            file.write(str)
            file.close()
        else:
            return str

    except Exception as ex:
        format(ex)

次に、別の Python プログラムから実行します。

winshell.shell_execute( 'db2 "CONNECT TO AGRIA"', filename )
winshell.shell_execute( 'db2 "CONNECT RESET"', filename )
winshell.shell_execute( 'db2 "CONNECT TERMINATE"', filename )

返されるコードは次のとおりです。

   Database Connection Information

 Database server        = DB2/NT64 10.5.0
 SQL authorization ID   = DB2ADMIN
 Local database alias   = AGRIA

SQL1024N  A database connection does not exist.  SQLSTATE=08003
DB20000I  The TERMINATE command completed successfully.

明らかに connect ステートメントが正常に実行されますが、終了した直後に接続が失われます。コンソール プロンプトでは、これら 3 つのコマンドは完全に機能します。

コンソールで単一のプロセス/スレッドとしてセッションを作成する方法を知っている人はいますか?

4

1 に答える 1

0

複数のコマンドを実行するために Python 3 で新しいプロセスを作成しようとしています」 -- 実際に行っているのは、3 つの異なるプロセスを作成することです。あるプロセスで何が起こっても、次のプロセスが始まる前に死んでしまいます。

すべての DB2 コマンドとステートメントをファイルにまとめてから、DB2 コマンド行プロセッサーを (1 回だけ) 呼び出して、ファイルをパラメーターとしてそれに渡す必要があります。すべてのコマンドを書いたとします:

CONNECT TO AGRIA
CONNECT RESET
CONNECT TERMINATE

というファイルにmydb2.txt. 次に、次のようにサブプロセスを起動します。

winshell.shell_execute( 'db2 -f mydb2.txt', filename )

ファイルに複数行のコマンドがある場合は、それぞれをセミコロンで終了し、そのようにしたことを DB2 CLP に伝えます。

winshell.shell_execute( 'db2 -tf mydb2.txt', filename )

-t「終了」のコマンドライン引数に注意してください。

于 2013-09-10T21:33:54.643 に答える