前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >安装psycopg2碰见的各种错误

安装psycopg2碰见的各种错误

作者头像
bisal
发布2019-08-18 13:11:36
2.2K0
发布2019-08-18 13:11:36
举报
文章被收录于专栏:bisal的个人杂货铺

一套新的Linux环境,需要部署个python写的程序,逻辑就是读取EDB数据库,进行一些数据的操作。由于连接的是EDB,需要pg的库psycopg2,当然能从官网进行下载(https://pypi.org/project/psycopg2/),但是本地安装,可能会碰见一些问题,其实主要是一堆依赖包的问题。

P. S. EDB数据库的介绍,

EDB是什么数据库?

EDB官方网站和文档的介绍

在这台裸机上,首先执行python setup.py build,提示Error: pg_config executable not found.,搜了下,需要环境中安装postgresql-devel(其中,红帽系需要安装postgresql-devel,Debian系则需要安装libpq-dev)。

由于机器在内网,无法访问外网,原打算找到相关的库,下载下来,本地安装,但崩溃的是,库之间的依赖关系如此复杂,例如postgresql-devel-11.4-alt1.x86_64.rpm依赖关系如下,

640?wx_fmt=png
640?wx_fmt=png

libecpg6-11.4-alt1.x86_64.rpm依赖关系如下,

640?wx_fmt=png
640?wx_fmt=png

libpq5-11.4-alt1.x86_64.rpm依赖关系如下,

640?wx_fmt=png
640?wx_fmt=png

于是退而求其次,找值班开了yum,这才是一劳永逸,安装postgresql-devel,再次执行python setup.py build,还是报错,不同的是,这次提示Python.h找不到,

640?wx_fmt=png
640?wx_fmt=png

根据提示No such file or directory的错误,有两种情况,一种是没有Python.h这个文件,一种是Python的版本不对。可以进入/usr/include/文件夹下的Pythonx.x文件夹里查找是否有Python.h这个文件。

针对这个问题,的确是第一种,那么需要安装python-dev这个包。那么问题来了,为何安装了Python,还需要python-dev?

Linux发行版通常会把类库的头文件和相关的pkg-config分拆成一个单独的xxx-dev(el)包。以python为例,以下情况是需要python-dev,

(1) 需要自己安装一个源外的python类库, 而这个类库内含需要编译的调用python api的c/c++文件。

(2) 自己写的一个程序编译需要链接libpythonXX.(a|so) (注:以上不含使用ctypes/ffi或者裸dlsym方式直接调用libpython.so)。

其他正常使用python或者通过安装源内的python类库的不需要python-dev。另外,python-dev的包在centos的yum中不叫python-dev,而是python-devel。

因此,python-dev或python-devel称为是python的开发包,其中包括了一些用C/Java/C#等编写的python扩展在编译的时候依赖的头文件等信息。例如在编译一个用C语言编写的python扩展模块时,因为里面会有#include<Python.h>等这样的语句,因此就需要先安装python-devel开发包。

*-devel开发包中主要包括一些头文件和静态链接库。任何*-devel包基本都是这样。注意python-dev或者其他*.devel软件一般都是C语言编写的一些头文件或cpp文件,往往是其他模块或者我们自己写的模块在编译时,需要依赖这些*-devel软件包。

如果用python-dev搜索,可能无法搜出来,但是用管道符,接力搜索,是可以搜出来的,而且提示正确的名称是python-devel.x86_64,

640?wx_fmt=png
640?wx_fmt=png

此时再次执行python setup.py build,虽然报错,但是很明显,未使用root账号执行,导致无法在/usr创建文件,改为root,即可正确安装psycopg2,

640?wx_fmt=png
640?wx_fmt=png

由此可见,Linux下的第三方库,往往因为依赖的问题,导致无法安装,一方面,yum提供了我们很方便的方式,满足各种库之间的依赖关系,另一方面,根据报错提示,能为我们找到解决方案,提供一些方向。

引申到我们的应用设计,对于一些应用级的错误,应该提供向导性的提示信息,便于用户从中自行找到解决方案,其实利人利己,但这一方面要求设计人员,对这种问题设计的很完备,另一方面要求开发人员有很强的责任心和意识,否则从实际工作中看,实现起来,确实不容易的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年07月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档