在Python中使用subprocess模块运行isql命令
我需要用Python来运行isql命令。
目前我这样做:
ps = subprocess.Popen("""./isql -I /app/sybase/interfaces_global -S %s -U %s -P %s -D %s -s "|" -w 99999 <<EOF
SET NOCOUNT ON
%s
go
EOF""" %(mdbserver,muserid,mpassword,mdatabase,User_Query),stdout=subprocess.PIPE,shell=True,cwd=sybase_path)
但是这种方法依赖于我服务器的/tmp目录,因为使用了这里文档(here document),每次运行时都会在/tmp目录下创建一个临时文件。当/tmp目录满了的时候,脚本就无法再执行数据库查询了。
我该如何在使用shell=False
的情况下,使用相同的命令,这样就可以摆脱这里文档和临时文件的创建呢?
这个方法不行:
ps = subprocess.Popen("./isql","-I","/app/sybase/interfaces_global","-S",mdbserver,"-U",muserid,"-P",mpassword,"-D",mdatabase,"-s","|","-w","99999","\nSET NOCOUNT ON\n",User_Query,"\ngo",stdout=subprocess.PIPE,shell=False,cwd=sybase_path)
2 个回答
0
看看这个子进程的 communicate()
命令。你可以用它把 isql 命令发送给解释器。
2
你可以通过设置 stdin=PIPE
来替代这里的文档,然后使用 .communicate()
方法将输入作为字符串提供,就像@Hans Then 提到的那样:
from subprocess import Popen, PIPE
from textwrap import dedent
isql = Popen(['./isql', '-I', '/app/sybase/...',
'-S', mdbserver,
'-U', muserid, ...,
'-w', '99999'], stdin=PIPE, stdout=PIPE, cwd=sybase_path)
output = isql.communicate(dedent("""\
SET NOCOUNT ON
{}
go
""".format(User_Query)))[0]