【问题标题】:Error importing psycopg2._psycopg when using uWSGI使用 uWSGI 时导入 psycopg2._psycopg 时出错
【发布时间】:2016-01-19 06:08:13
【问题描述】:

我在尝试运行 uwsgi --ini <my uwsi ini file> 时收到以下导入错误:

Traceback (most recent call last):
  File "/var/www/mysite/venv/lib/python3.5/site-packages/django/db/backends/postgresql/base.py", line 20, in <module>
    import psycopg2 as Database
  File "/var/www/mysite/venv/lib/python3.5/site-packages/psycopg2/__init__.py", line 50, in <module>
    from psycopg2._psycopg import BINARY, NUMBER, STRING, DATETIME, ROWID
ImportError: No module named 'psycopg2._psycopg'

但是,当我运行网站时,一切都运行良好

python manage.py runserver --settings=config.settings.prod

psycopg2 已安装,Django 可以发现没有问题。只有当我使用uwsgi 运行服务器时,它才能找到_psycopg 模块。

这是我的 uwsgi.ini

[uwsgi]
# variables
base = /var/www/mysite

# general settings
master = True
plugins = python3
vacuum = True

env = DJANGO_SETTINGS_MODULE=config.settings.prod
env = PYTHONHASHSEED=random

# directory containing packages
chdir=%(base)/server

# python modules and paths
home = %(base)/venv
module = config.wsgi:application
pythonpath = %(chdir)
pythonpath = %(home)/lib/python3.5/site-packages

# socket file settings
socket = %(base)/conf/%n.sock
uid = www-data
gid = www-data
chmod-socket = 644
chown-socket = www-data:www-data

# location of log files
logto = /var/log/uwsgi/%n.log

这两种模式有什么区别?我看到的唯一区别是我以 root 身份运行 manage.py,而 uwsgi 作为用户 www-data 运行(根据 .ini),但以 root 身份运行 uwsgi 给出了相同的错误。

有什么线索吗?

编辑:

uwsgi错误日志中找到线索:

*** Starting uWSGI 2.0.7-debian (64bit) on [Mon Jan 18 22:27:08 2016] ***
compiled with version: 4.9.1 on 25 October 2014 19:17:54
os: Linux-3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u2 (2016-01-02)
nodename: averna
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /var/www/mysite/scripts
detected binary path: /usr/bin/uwsgi-core
your processes number limit is 1789
your memory page size is 4096 bytes
detected max file descriptor number: 65536
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to UNIX address /var/www/mysite/conf/uwsgi.sock fd 3
setgid() to 33
setuid() to 33
Python version: 3.4.2 (default, Oct  8 2014, 10:47:48)  [GCC 4.9.1]
PEP 405 virtualenv detected: /var/www/mysite/venv
Set PythonHome to /var/www/mysite/venv
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x23b43f0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 145536 bytes (142 KB) for 1 cores
*** Operational MODE: single process ***
added /var/www/mysite/server/ to pythonpath.
added /var/www/mysite/venv/lib/python3.5/site-packages/ to pythonpath.
Traceback (most recent call last):
  File "/var/www/mysite/venv/lib/python3.5/site-packages/django/db/backends/postgresql/base.py", line 20, in <module>
    import psycopg2 as Database
  File "/var/www/mysite/venv/lib/python3.5/site-packages/psycopg2/__init__.py", line 50, in <module>
    from psycopg2._psycopg import BINARY, NUMBER, STRING, DATETIME, ROWID
ImportError: No module named 'psycopg2._psycopg'

它说uwsgi 使用的是 Python 版本 3.4.2(系统版本),但我在 virtualenv 中运行的是 3.5.1。现在如何解决这个问题而不必在我的 virtualenv 中降级到 Python 3.4.2?

【问题讨论】:

  • 我注意到的一件事是 uwsgi 调用正在运行 python3.5,而在大多数情况下,我希望人们使用 Django 运行 python2.7。你确定你的python3.5版本下安装了psycopg2?
  • @AaronLayfield,一切都基于 Python 3.5。 Django 运行良好,只是 uwsgi 的这个问题困扰着我。
  • 好吧,让我再看看它。只是想突破基础。
  • 当你运行 python 控制台和import psycopg2 时会发生什么?如果可行,请跟进from psycopg2._psycopg import BINARY, NUMBER, STRING, DATETIME, ROWID。如果 Django 和 wsgi 都在同一个 Python 版本上运行,那么除了版本的潜在差异之外,没有任何逻辑上的原因会导致失败。是否安装了更多版本的 Python3.X?
  • 看起来您可能必须重新安装 uWSGI 或至少使用 python3.5 uwsgiconfig.py --build 或类似的方式重建它。从技术上讲,这应该正确地将 uwsgi '链接'到正确的版本 projects.unbit.it/uwsgi/wiki/MultiPython ~~ stackoverflow.com/questions/13537373/… (之前问过的问题)。

标签: django uwsgi psycopg2


【解决方案1】:

psycopg2 不适用于 python 3.5

来自the features list

支持从 2.5 到 3.4 的 Python 版本(在 Psycopg 版本 2.4.x 之前支持 Python 2.4)。

如果你想使用这个包,你需要降级到 python 3.4

【讨论】:

  • 刚回来说明这一点,在空闲时间做了一些挖掘,发现了这一点。对不起@Def_Os!
  • 实际上,由于我使用 Django 的 manage.py 运行站点没有问题,这意味着这不是我的问题的原因,psycopg2 对我来说使用 Python 3.5。
  • 2019 年的情况并非如此。
【解决方案2】:

我通过避免sudo apt-get install uwsgi 安装uwsgiuwsgi-plugin-python3 解决了这个问题。这导致了为 Python 3.4 构建的版本(也在我的系统上)。

相反,我使用sudo pip3 install uwsgi 安装,pip3 是我的 Python 3.5 目录中的一个。这为 Python 3.5 构建了 uwsgi 及其插件。我只需要将生成的 uwsgi 文件符号链接到 /usr/bin (ln -s &lt;my python 3.5 dir&gt;/bin/uwsgi /usr/bin/uwsgi),以便它在系统范围内可用。

psycopg2 对我来说似乎可以在 Python 3.5 上正常工作,所以我唯一的问题是 uwsgi 需要使用 Python 3.5 构建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2023-01-05
    • 2016-10-06
    • 2018-08-21
    • 2014-02-05
    • 2016-09-05
    • 1970-01-01
    相关资源
    最近更新 更多