Python 通过sqlplus运行shell脚本

Python 通过sqlplus运行shell脚本,python,oracle,shell,sqlplus,Python,Oracle,Shell,Sqlplus,我在prod env中以oracle身份登录,在SQLPLUS中时需要在远程主机上运行SHELL脚本。我正试图通过python实现这一点。有什么办法吗 我能够从sqlplus运行SQL脚本或SQL命令,如下所示:- session = Popen(['sqlplus','-S','abc/abc@'+str(hostname)+':1000/'+str(dbname)+''], stdin=PIPE, stdout=PIPE, stderr=PIPE) session.stdin.wri

我在prod env中以oracle身份登录,在SQLPLUS中时需要在远程主机上运行SHELL脚本。我正试图通过python实现这一点。有什么办法吗

我能够从sqlplus运行SQL脚本或SQL命令,如下所示:-

session = Popen(['sqlplus','-S','abc/abc@'+str(hostname)+':1000/'+str(dbname)+''], stdin=PIPE, stdout=PIPE, stderr=PIPE)
    session.stdin.write('SPOOL '+str(op_file)+' \n'
                        ' '+str(data)+ '\n');

    session.stdin.write(' ; \n')
    session.stdin.write('exit \n')
    session.stdin.flush()
    stdout, stderr = session.communicate()
但是,当我想运行shell脚本时,有没有办法通过sqlplus本身来运行,因为不可能通过ssh和sudo以oracle的身份登录

我认为这是使用PLSQL的一种方法:-


但是我不确定。

SQL*Plus是一个客户端应用程序。它可以在客户机上生成进程,这些进程将在客户机上运行shell脚本。它无法在数据库服务器上生成进程


正如您链接到的,您可以使用数据库服务器上的
dbms\u调度程序
包在服务器上生成将运行批处理文件的进程。您可以对Java存储过程执行类似的操作,因为它也在服务器上运行
dbms_调度程序
还可以在安装了适当的调度程序代理后执行此操作,但在绝大多数情况下,这似乎不太可能特别有用。

通过pl/sql代码块(如使用os_command.exec())执行此操作怎么样它还会在本地运行该命令吗?@user3638694-我不知道你说的“os_command.exec()”是什么意思。您是说您的数据库中有一个程序包
os\u command
,其中包含一个程序
exec
?有可能是有人写的。如果是这样的话,我猜
exec
过程调用的是一个Java存储过程,它按照我在回答中建议的方式执行操作系统命令。如果这就是您所拥有的,那么Java存储过程将在数据库服务器上生成进程。但是,此Java过程是否会在本地数据库服务器或我使用“sqlplus”连接的远程数据库服务器上生成进程,-s,'abc/abc@'+主机名+':1000/'+dbname@user3638694-Java存储过程将在安装Java存储过程的数据库服务器上生成该进程。如果Java存储过程安装在远程数据库服务器上,它将在远程数据库服务器上启动一个进程。如果Java存储过程安装在本地数据库服务器上,它将在本地数据库服务器上启动一个进程。无论是否安装了数据库服务器,运行SQL*Plus的计算机都是客户机。