【问题标题】:subprocess.popen and psqlsubprocess.popen 和 psql
【发布时间】:2011-06-28 12:43:10
【问题描述】:

我有需要调用 psql 的 Django 应用程序。我在一个 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 似乎可以识别主机。至少它会要求输入密码。

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

【问题讨论】:

    标签: python django postgresql subprocess psql


    【解决方案1】:

    我认为 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
    

    【讨论】:

    • 当你这么说的时候,这有点明显:) 谢谢!
    【解决方案2】:

    当您不提交 env 时,它会从您正在运行的 shell 中获取环境变量 - 请参阅 os.environ。它必须取决于查找本地主机的其中之一。您需要将其包含在字典中。或者只是从 os.environ 复制所有内容。

    【讨论】:

      猜你喜欢
      • 2014-04-23
      • 2019-01-20
      • 2020-04-25
      • 2013-03-09
      • 2018-06-08
      • 2013-08-20
      • 2011-06-16
      • 2018-01-14
      相关资源
      最近更新 更多