subprocess.popen and psql

4
我有一个Django应用程序,需要调用psql。我在一个celery线程中执行此操作,代码如下:
@task()
def insert_sqldump_threaded(username, database, file):
  host = database.server.db_address

  work = subprocess.Popen([settings.PSQL, 
                          "-f%s" % file, 
                          "-d%s" % database.db_name,
                          "-h%s" % host,
                          "-U%s" % settings.DB_ADMIN_USER
                          ], env = {'PGPASSFILE': settings.DB_PASSFILE}
                          )
  work.wait()
  return work.returncode

在我的开发服务器上,PGPASSFILE 文件如下所示:
localhost:5432:*:postgres:postgres

这应该没问题。

问题在于,当调用此函数时,我得到的只是来自psql的错误:

psql: could not translate host name "localhost" to address: Unknown server error

现在变得非常奇怪,是这样的,当我不提交“env”变量时,psql似乎会识别主机。至少此时它会要求输入密码。

有任何解决方法吗?

2个回答

3

我认为postgresql需要其他环境变量,当你通过env传递时,你需要清除它们。你可以简单地改变os.environ或者在以下代码中事先复制它:

import os
@task()
def insert_sqldump_threaded(username, database, file):
  d = dict(os.environ)
  d['PGPASSFILE'] = settings.DB_PASSFILE
  host = database.server.db_address

  work = subprocess.Popen([settings.PSQL, 
                          "-f%s" % file, 
                          "-d%s" % database.db_name,
                          "-h%s" % host,
                          "-U%s" % settings.DB_ADMIN_USER
                          ], env = d
                          )
  work.wait()
  return work.returncode

当你这样说的时候,有点显而易见 :) 谢谢! - Kai

0

当您不提交 env 时,它会从您运行的 shell 中获取环境变量 - 参见 os.environ。它必须依赖其中一个来查找 localhost。您需要将其包含在字典中。或者只需复制 os.environ 中的所有内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接