[英]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.