簡體   English   中英

Python 子進程掛起 psql 命令

[英]Python subprocess hangs with psql command

我正在運行以下 Python 代碼(在 shell 中運行命令並獲取其輸出或報告錯誤)

import sys
import subprocess
def check_output(args, communicate=None, quiet=False, **kwargs):
    for stream in ["stdout", "stderr"]:
        kwargs.setdefault(stream, subprocess.PIPE)

    proc = subprocess.Popen(args, **kwargs)
    try:
        out, err = proc.communicate()
    finally:
        for f in (proc.stdout, proc.stderr):
            if f is not None:
                f.close()
        proc.wait()

    if kwargs["stderr"] != subprocess.PIPE:
        err = ""

    if proc.returncode != 0:
        raise Exception(args, proc.returncode, err)
    else:
        if not quiet:
            sys.stderr.write(err)
            sys.stderr.flush()
    return out

具有以下參數:

env = dict(
        PGHOST='{pg_host}',
        PGPORT='{pg_port}',
        PGDATABASE='{pg_dbname}',
        PGUSER='{pg_user}',
        PGPASSWORD='{pg_password}',
      )

cmd = ['psql', '-c', "INSERT INTO {ft_geom} SELECT * FROM {ft_geom_in};"].format(**tables)
check_output(cmd, shell=True, env=env)

這里env只包含PG[HOST|USER|DATABASE|PORT|..]環境變量, tables只包含這兩個表的名稱。 當我運行這段代碼時,它無限期地掛在proc = subprocess.Popen調用上。 我在Ubuntu 10.04.3 LTS上使用 python 2.6.5

我檢查沒有表被以下鎖定:

SELECT a.datname,
         c.relname,
         l.transactionid,
         l.mode,
         l.granted,
         a.usename,
         a.current_query, 
         a.query_start,
         age(now(), a.query_start) AS "age", 
         a.procpid 
    FROM  pg_stat_activity a
     JOIN pg_locks         l ON l.pid = a.procpid
     JOIN pg_class         c ON c.oid = l.relation
    ORDER BY a.query_start;

它表明所有的鎖都被授予了。 不知道還有什么地方可以看。 我需要shell=True因為命令有時更復雜,需要 bash 管道。 我知道我應該理想地將一個命令的stdout.PIPE傳遞stdout.PIPE另一個命令,但目前無法改變這一點。

從 bash 直接運行相同的命令可以按預期工作,而且,在沒有shell=True情況下運行也可以

問題是我沒有過濾傳遞給check_output令牌中的check_output ,然后 shell 會掛起等待更多輸入。 因此,請確保在將令牌傳遞給 shell 時對其進行轉義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM