安装后出现ImportError: No module named psycopg2错误

11

我已经成功地在我的Ubuntu服务器上从我的虚拟环境中运行了sudo pip install psycopg2

这是我正在尝试运行的代码:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://USERNAME:PASSWORD@localhost/mydb"
db = SQLAlchemy(app)
app.debug = True

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(100))

@app.route('/users/', methods = ['GET'])
def users():
    query = "SELECT id, name FROM users"

    results = User.query.from_statement(query).all()

    json_results = []
    for result in results:
        d = {'id' : result.id,
            'name' : result.name}
        json_results.append(d)

    res = jsonify(items=json_results)
    res.headers['Access-Control-Allow-Origin'] = '*'
    return res

然而,当像这样使用uWSGI运行此文件:uwsgi --socket 127.0.0.1:8080 --wsgi-file my_app.py --callable app --processes 4 --threads 2 --stats 127.0.0.1:9191,并使用SERVER_URL/users/调用它时,我会收到以下错误:

Traceback (most recent call last):
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "my_app.py", line 18, in users
    results = User.query.from_statement(query).all()
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 428, in __get__
    return type.query_class(mapper, session=self.sa.session())
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py", line 70, in __call__
    return self.registry()
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/sqlalchemy/util/_collections.py", line 903, in __call__
    return self.registry.setdefault(key, self.createfunc())
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 139, in __init__
    bind=db.engine,
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 780, in engine
    return self.get_engine(self.get_app())
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 797, in get_engine
    return connector.get_engine()
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 473, in get_engine
    self._engine = rv = sqlalchemy.create_engine(info, **options)
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/sqlalchemy/engine/__init__.py", line 344, in create_engine
    return strategy.create(*args, **kwargs)
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/sqlalchemy/engine/strategies.py", line 73, in create
    dbapi = dialect_cls.dbapi(**dbapi_args)
  File "/home/ubuntu/my_app/my_app_venv/local/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py", line 401, in dbapi
    import psycopg2
ImportError: No module named psycopg2
[pid: 10902|app: 0|req: 3/3] 74.108.216.27 () {40 vars in 708 bytes} [Sun May 18 01:46:00 2014] GET /users/ => generated 0 bytes in 13 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0)

你的虚拟环境是否已启用?由于运行应用程序将在新的 shell 环境中打开,而默认情况下该环境未启用,因此您可能希望从您的 .bashrc 脚本中启用它。 - gilsho
是的,我的虚拟环境已启用,并且我已安装了pip并从虚拟环境中运行了uWSGI。 - mverderese
sudo uwsgi --socket 127.0.0.1:8080 的执行结果是 sudo: uwsgi: command not found。这很有道理,因为使用sudo权限运行uwsgi会破坏虚拟环境的目的。 - mverderese
虚拟环境的目的是允许您为不同的项目安装不同的模块,也许是同一模块的不同版本。例如,如果您有一个需要模块版本1.0的项目一和一个需要模块版本2.0的项目二,则没有简单的方法可以解决这个问题,除非使用虚拟环境。但无论如何,以sudo身份运行应用程序都不是一个好主意,因为您可能会意外地对系统造成严重的损害。 - gilsho
1
我不知道为什么 "sudo uwsgi" 不起作用,可能是路径问题,但问题似乎在于您使用 "sudo pip" 安装了模块。尝试运行 "sudo pip uninstall psycopg2",然后再次安装为 "pip install psycopg2"。 - gilsho
显示剩余5条评论
6个回答

19

问题在于您使用'sudo'作为超级用户安装了psycopg2。当您以超级用户身份运行命令时,该命令将在具有超级用户环境的不同shell中执行,并且结果包将安装在文件系统中不同的位置,可能无法访问您的“普通”环境。您需要再次以普通用户的身份安装软件包,即不使用前缀'sudo'才能使用该软件包。简而言之,请运行:

pip install psycopg2

1
当我使用 pip install psycopg2 时,它试图将其安装到一个目录中,该目录没有访问权限!如果不使用sudo,安装根本无法进行。我以前从未遇到过Python包的问题,我真的很困惑为什么安装psycopg2变得如此容易,以至于它对Python不可见。 - Noah
是的,安装psycopg有点奇怪,因为它要求您已经在计算机上安装了postgresql。通常,postgresql需要安装在文件系统的受限部分,以便作为服务访问,并且需要超级用户权限。 - gilsho

7

我在尝试安装这个包的过程中遇到了问题,根本无法安装。 https://pypi.org/project/psycopg2/

从那个页面上我找到了这个选项:

pip install psycopg2-binary

嘭!它奏效了!


3
解决方案:使用yum或apt而不是pip安装软件包。
sudo yum install python-psycopg2

然后所有用户都可以使用psycopg2。

pip install psycogp2

将会由于权限问题而失败:

IOError: [Errno 13] Permission denied: '/usr/lib64/python2.7/site-packages/psycopg2-2.7.6.1.dist-info/METADATA'

pip 对我从来都不起作用,我只能使用 yum 或 apt 来安装。对于 Python 2,请使用 sudo apt install python-psycopg2,对于 Python 3,请使用 sudo apt install python3-psycopg2。 - Code Demon

1
我在Ubuntu上遇到了同样的问题,尝试使用apt-getpip都无法解决。最终我从这里卸载了pip和apt-get中的软件,并下载了源代码包。一旦你有了源代码,只需运行以下命令:
python setup.py build
sudo python setup.py install

之后我不需要再做其他事情。Psycopg2可以在Python的默认安装中导入。

很奇怪,因为安装说明明确建议如果有适合你操作系统的包,则使用该包,但是在Ubuntu上,只有源代码方法适用于我。


1

直接使用这个:

sudo pip install psycopg2-binary==2.8.4

0

当我将一个包含虚拟环境的文件夹的内容复制到一个新的文件夹时,我遇到了这个问题。

即使在命令行或VS Code中使用活动的venv运行pip install psycopg2后,

我的解决方案是删除虚拟环境文件夹,创建一个新的虚拟环境,并使用pip重新安装所有软件包。


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