Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python子进程Popen未输出sqlplus错误字符串_Python 3.x_Sqlplus - Fatal编程技术网

Python 3.x Python子进程Popen未输出sqlplus错误字符串

Python 3.x Python子进程Popen未输出sqlplus错误字符串,python-3.x,sqlplus,Python 3.x,Sqlplus,当我使用子流程在Python中运行sqlplus时,如果出现SQL错误,或者update或insert语句返回更新或插入的行数,则不会得到任何输出。当我在没有错误的情况下运行select语句时,我会得到输出 这是我的密码: 这将创建一个包含新行的字符串,然后将其写入process.stdin.write() 此代码执行SQL命令 def execute_sql_file(username, dbpass, args): db_conn_str = username + '/' + d

当我使用子流程在Python中运行sqlplus时,如果出现SQL错误,或者update或insert语句返回更新或插入的行数,则不会得到任何输出。当我在没有错误的情况下运行select语句时,我会得到输出

这是我的密码: 这将创建一个包含新行的字符串,然后将其写入process.stdin.write()

此代码执行SQL命令

def execute_sql_file(username, dbpass, args):


    db_conn_str = username + '/' + dbpass + '@' + args.dbname
    # '-S', - Silent
    sqlplus_cmd = ['sqlplus', '-S', '-L', db_conn_str]
    if crs_debug:
        print('DEBUG: ' + ' '.join(sqlplus_cmd))

    process = subprocess.Popen(sqlplus_cmd,
                               stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

    write_sql_string(process, args)

    stdout, stderr = process.communicate()
    # Get return code of sql query
    stdout_lines = stdout.split("\n")
    print('STDOUT')
    for line in stdout_lines:
        line = line.rstrip()
        print(line)

    stderr_lines = stderr.split("\n")
    print('STDERR')
    for line in stderr_lines:
        line = line.rstrip()
        print(line)

    sqlplus_rc = process.poll()

    # Check if sqlplus returned an error
    if sqlplus_rc != 0:
        print("FAILURE in " + script_name + " in connecting to Oracle exit code: " + str(sqlplus_rc))
        print(stderr_data)
        sys.exit(sqlplus_rc)
当我运行一个需要参数的SQL文件时,我会运行我的代码,如果我运行它时缺少参数,我就不会得到任何输出。如果我用参数运行它,我会得到正确的输出

下面是一个示例SQL文件sel_dual.SQL:

SELECT 'THIS IS TEXT &1 &2' FROM dual;
例如,命令行:

run_sql_file.py dbname sql_file [arg1]...[argn]
如果我用

run_sql_file.py dbname sel_dual.py
run_sql_file.py dbname sel_dual.py Seth F
我没有得到任何输出,即使它应该请求一个参数并给出其他错误输出

如果我用

run_sql_file.py dbname sel_dual.py
run_sql_file.py dbname sel_dual.py Seth F
我得到了正确的输出:


'THISISTEXTSETHF'
----------------------------------------------------------------------------
THIS IS TEXT Seth F
引用的args是使用argparse模块处理args的结果:

        parser = argparse.ArgumentParser(description='Run a SQL file with ptional arguments using SQLPlus')
    parser.add_argument('dbname', help='db (environment) name')
    parser.add_argument('sql_file_name', help='sql file')
    parser.add_argument('sql_args', nargs='*', help='arguments for sql file')
    args = parser.parse_args()
有人知道这是什么原因吗?我省略了脚本的其余部分,因为它基本上获取命令参数并验证SQL文件是否存在

我正在运行sqlplus版本12.1.0.2.0生产版。我正在运行Python版本3.7.6。我在Linux上运行(不确定是什么版本)。内核版本是4.1.12-124.28.5.el7uek.x86_64。

什么是“args”?你能提供解析args的代码吗?什么是“args”?你能提供解析args的代码吗?