subprocess.popen и psql - PullRequest
       11

subprocess.popen и psql

3 голосов
/ 16 февраля 2011

У меня есть приложение Django, которое должно вызвать 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, кажется, распознает хост. По крайней мере, тогда он запрашивает пароль.

Есть идеи, как решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 16 февраля 2011

Я думаю, что 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 голосов
/ 16 февраля 2011

Когда вы не отправляете env, он выбирает переменные среды из оболочки, в которой вы работаете - см. os.environ .Это должно зависеть от одного из тех, кто ищет localhost.Вам нужно будет включить это в словарь.Или просто скопируйте все из os.environ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...