在Python中使用subprocess模块运行isql命令

0 投票
2 回答
1673 浏览
提问于 2025-04-18 15:19

我需要用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]

撰写回答