如何使用subprocess.Popen解析psql输出

时间:2014-12-10 16:38:10

标签: python psql

我想通过psql --username=fred myDB < //10.0.0.1/share/dump.sql.pgdump执行命令subprocess.Popen,以便我可以解析输出。但是,这样做时会出现以下错误:

>>> psql: warning: extra command-line argument "<" ignored
>>> psql: warning: extra command-line argument "//10.0.0.1/share/dump.sql.pgdump" ignored

我似乎没有正确格式化命令,但我不明白为什么。这就是我到目前为止所做的:

PASS = 'mypassword'
os.putenv('PGPASSWORD', PASS)
latest_dump = '//10.0.0.1/share/dump.sql.pgdump'
cmd = ['psql', '--username=fred', 'myDB', '<', latest_dump]
p = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT )

# Print each line
for line in iter(p.stdout.readline, b''):
    sys.stdout.flush()
    print(">>> " + line.rstrip())

1 个答案:

答案 0 :(得分:1)

<重定向器的使用是shell的功能。如果您的值是安全的(意味着它们不受不受信任的用户控制),您可以使用shell=True关键字参数:

cmd = 'psql --username=fred myDB < %s' % latest_dump
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)

更好的方法是:

cmd = ['psql', '--username=fred', 'myDB']
p = subprocess.Popen(cmd, stdin=open(latest_dump),
                     stdout=subprocess.PIPE,
                     stderr=subprocess.STDOUT)

当然,您可能希望使用with open(latest_dump) as ...:块来打开文件。