0

我正在尝试使用 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.

显然,它成功地运行了连接语句,但是在完成时连接就丢失了。在控制台提示符下,这 3 个命令完美运行。

有谁知道如何在控制台中创建一个会话作为单个进程/线程?

4

1 回答 1

0

尝试使用 Python 3 创建一个新进程来运行多个命令”——您实际上在做的是创建三个不同的进程。一个进程中发生的任何事情都会在下一个进程开始之前随之消亡。

您需要将所有 DB2 命令和语句放在一个文件中,然后调用 DB2 命令行处理器(仅一次)并将文件作为参数传递给它。假设您编写了所有命令:

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 回答