【问题标题】:using subprocess module in python to run isql command在 python 中使用 subprocess 模块运行 isql 命令
【发布时间】:2014-07-30 10:56:00
【问题描述】:

我必须使用 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 目录已满时,脚本无法对数据库运行查询。

我怎样才能用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)

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

    您可以通过设置stdin=PIPE 并使用.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]
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2014-09-18
        • 2018-02-12
        • 2015-06-02
        • 2016-11-08
        • 2014-09-30
        • 2020-05-18
        • 2019-07-05
        • 2020-07-25
        • 2016-12-30
        相关资源
        最近更新 更多