Python 3.x Python子进程Popen未输出sqlplus错误字符串
当我使用子流程在Python中运行sqlplus时,如果出现SQL错误,或者update或insert语句返回更新或插入的行数,则不会得到任何输出。当我在没有错误的情况下运行select语句时,我会得到输出 这是我的密码: 这将创建一个包含新行的字符串,然后将其写入process.stdin.write() 此代码执行SQL命令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
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的代码吗?