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

时间:2014-07-30 10:56:01

标签: python subprocess

我必须使用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目录,因为这里有文档,每当我运行它时,它在/ tmp目录中创建一个tmp文件,当/ tmp目录已满时脚本无法将Query运行到数据库上。

我如何在shell=False使用相同的命令,这样我就可以摆脱这里的文件&#34;&#34;&#34;和临时文件创建。

这不起作用

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 :(得分:2)

您可以通过设置stdin=PIPE替换here-document,并使用.communicate()方法将输入作为字符串提供为@Hans Then suggested

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]

答案 1 :(得分:0)

查看子进程communicate()命令。您可以使用它将isql命令发送给解释器。