2011-02-16 51 views
3

我有需要调用psql的Django应用程序。我这样做是在芹菜丝,看起来像这样:subprocess.popen和psql

@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似乎认识到主机。至少它会要求输入密码。

关于如何解决这个问题的任何想法?

回答

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 
+0

当你这样说的时候,它有点显而易见:)谢谢! – Kai 2011-02-16 17:57:04

0

当你不提交包膜,它从你在运行shell拿起环境变量 - 见os.environ。它必须取决于查找本地主机的其中之一。你需要将其包含在字典中。或者只是复制os.environ中的所有内容。