专栏首页bisal的个人杂货铺安装psycopg2碰见的各种错误

安装psycopg2碰见的各种错误

一套新的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依赖关系如下,

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

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

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

根据提示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,

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一次对linux系统无影响的python3环境搭建过程及思考

    Linux系统中默认的python版本为Python 2,而根据Python的官方邮件消息,Python 2即将于2020年终止所有的支持。简单的将Python...

    bisal
  • 《Oracle Concept》第三章 - 7

    按照《Oracle Conecpt》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。

    bisal
  • CBO如何选择相同cost的索引

    根据10053显示,可以看出,IDX_Z_01和IDX_Z_02这两个索引,cost相同,CBO会选择何种执行计划?

    bisal
  • python中any和all如何使用

    python中any()和all()如何使用 和 对于检查两个对象相等时非常实用,但是要注意, 和 是python内置函数,同时numpy也有自己实现的 和 ,...

    企鹅号小编
  • python入门学习步骤,希望对你有所帮助

    学习python的过程分为四个阶段:了解python、找个例子练手、做项目、能力提升。

    python学习教程
  • Python3.2.3官方文档(中文版)

    链接:http://www.pythonheidong.com/blog/article/66/

    py3study
  • MySQL for Python(一)

    一.安装mysql-python 1.suse,redhat,fedora系统 #yum install mysqldb 2.debian,ubuntu系统 #...

    py3study
  • python学习笔记一

    之前看过一本100多页的《python简明教程》,都是些非常简单的语法,现在到真正用的时候根本无从下手,所以,重新捧起一本《python学习手册》,1000多页...

    CloudDeveloper
  • Python编程->cannot ope

    py3study
  • python学习之路

    ①软件质量、开发者的效率、程序的可移植性、标准库的支持、组件集成和享受简便,其中质量和效率是选择python的主要原因。

    py3study

扫码关注云+社区

领取腾讯云代金券