当前位置:   article > 正文

centos7安装完显示设备报错_[Python] centOS7.安装Python3

_uuidmodule.c:33:5: error: implicit declaration of function ‘uuid_create’

85f970b2e85d1d5b7c3ff80990482d8b.png

折腾的路径

保留python2

系统(如下)自带python版本为2.7,在安装python3之前千万不要卸载,因为yum依赖python2,卸载python2后yum无法正常工作

  1. [root@zheteng bin]# cat /etc/redhat-release
  2. CentOS Linux release 7.5.1804 (Core) #请注意以下操作均在此版本centOS下进行

下载python3

建议虚拟机建议宿主机迅雷下载,通过共享目录给虚拟机读取

wget https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tgz #下载需要的版本

解压并进入解压目录

  1. tar zxvf Python-3.7.7.tgz #找个目录解压
  2. cd Python-3.7.7   #进入解压包目录下

指定安装目录

狭义的理解就是这个意思

./configure --prefix=/usr/local/python377

编译并安装

  1. make
  2. make install

建立软连接

现在直接输入python,还是对应到/usr/bin/python2上,需将python连接到python3上。当然,事先做好备份。

  1. mv /usr/bin/python /usr/bin/python.bak #备份
  2. ln -s /usr/local/python377/bin/python3.7 /usr/bin/python #建立python命令连接
  3. ln -s /usr/local/python377/bin/pip3.7 /usr/bin/pip #建立pip命令连接

运行

  1. python #显示版本3.7.7
  2. pip list #显示警告,无法使用openssl模块

警告信息

WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.

据说是openssl版本不满足python3.7的要求,手动安装openssl,重新编译并安装python3.7,重试仍然报错,说明手动安装无效,或安装步骤有误,或缺少包依赖。

自动安装openssl

yum install openssl-devel #试图通过yum自动安装openssl

报错(如下),python语法错误(此异常处理是python2的语法,python3应为 except KeyboardInterrupt as e)。

  1. File "/usr/bin/yum", line 30
  2. except KeyboardInterrupt, e:
  3. ^
  4. SyntaxError: invalid syntax

原因是在前面的操作中,将python指向了pyhton3,查看yum脚本可以发现,这里需要使用/usr/bin/python来执行

  1. vi /usr/bin/yum #查看yum脚本
  2. #!/usr/bin/python
  3. import sys
  4. try:
  5. import yum

还好没有卸载python2,还有的救。需要修改两个文件/usr/bin/yum和/usr/libexec/urlgrabber-ext-down

  1. #!/usr/bin/python.bak #修改为使用前面做的备份(即python2)来执行
  2. import sys
  3. try:
  4. import yum

重新用yum安装openssl成功。

其他问题

缺少zlib

出于洁癖,安装virtualenv,安装报错:zipimport.ZipImportError: can't decompress data; zlib not available,安装此包

yum install zlib zlib-devel

缺少_ctypes模块

复制黏贴:python3中有个内置模块叫ctypes,它是python3的外部函数库模块,提供了兼容C语言的数据类型,并通过它调用Linux系统下的共享库(Shared library),此模块需要使用centos7系统中外部函数库(Foreign function library)的开发链接库(头文件和链接库),而在centos7系统中没有安装外部函数库(libffi)的开发链接库软件包。

安装libffi包

yum install libffi-devel

安装成功

重新编译安装python3.7即可

推荐的安装步骤

上面饶了很多弯路,哪怕到最后其实还有些问题没有解决,比如安装时会提示还有些模块,比如readline之类的安装错误,主要是缺少包依赖和提前解挂python2(导致yum无法工作)造成,后续遇到一个module not found就补安装一个,比较麻烦。

  1. import pandas as pd #导入pandas包
  2. ModuleNotFoundError: No module named '_bz2' #报错
  3. yum install bzip2-devel #安装依赖包
  4. make #编译
  5. make install #安装
  6. Python build finished successfully! #提示安装成功
  7. The necessary bits to build these optional modules were not found: #还是有些模块未编译好
  8. _dbm _gdbm _lzma
  9. _sqlite3 _tkinter _u
  10. import panda as pd #再次导入
  11. UserWarning: Could not import the lzma module. Your installed Python is incomplete. #还是缺少部分依赖

因此建议安装步骤为:

安装依赖包

yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel xz-devel gdbm-devel

指定安装目录

./configure --prefix=/usr/local/python377

编译安装

  1. make
  2. make install

建立软连接

  1. mv /usr/bin/python /usr/bin/python.bak #可选步骤,因为/usr/bin/python指向/usr/bin/python2
  2. ln -s /usr/local/python377/bin/python3.7 /usr/bin/python #建立python命令连接
  3. ln -s /usr/local/python377/bin/pip3.7 /usr/bin/pip #建立pip命令连接

保证yum正常工作

  1. vi /usr/bin/yum 及 /usr/libexec/urlgrabber-ext-down
  2. #!/usr/bin/python2 #将此处“python”修改为“python2”或“python2.7
  3. import sys
  4. try:
  5. import yum

一顿操作后,软连接情况参考如下

  1. lrwxrwxrwx 1 root root 34 328 13:00 python -> /usr/local/python377/bin/python3.7
  2. lrwxrwxrwx. 1 root root 9 717 2018 python2 -> python2.7
  3. -rwxr-xr-x. 1 root root 7216 411 2018 python2.7
  4. lrwxrwxrwx. 1 root root 7 717 2018 python.bak -> python2

UUID模块

按上述步骤操作后,如果还提示有_uuid模块无法编译的问题,比如报_uuidmodule.c文件中”未知的类型名uuid_t"的错误

  1. In function ‘py_uuid_generate_time_safe’:
  2. /Modules/_uuidmodule.c:15:5: error: unknown type name ‘uuid_t’
  3. uuid_t uuid;
  4. ^
  5. /Modules/_uuidmodule.c:32:5: error: implicit declaration of function ‘uuid_generate_time’ [-Werror=implicit-function-declaration]
  6. uuid_generate_time(uuid);
  7. ^
  8. /Modules/_uuidmodule.c:33:33: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
  9. return Py_BuildValue("y#O", (const char *) uuid, sizeof(uuid), Py_None);

Python3.7.7

那么检查python解压目录下Modules/_uuidmodule.c文件,里面没有uuid_t的类型声明,说明这个声明在头文件里(某个uuid.h文件里)

  1. >> vi _uuidmodule.c
  2. #include "Python.h"
  3. #ifdef HAVE_UUID_UUID_H
  4. #include <uuid/uuid.h>
  5. #elif defined(HAVE_UUID_H)
  6. #include <uuid.h>
  7. #endif

按上述条件编译声明,如果定义了 HAVE_UUID_UUID_H 或者 HAVE_UUID_H,分别用不同的头文件来编译,这里不同的头文件对应 /usr/include/uuid.h/usr/include/uuid/uuid.h ,分别来自uuid-devellibuuid两个包。

在确认两个头文件都在之后,推测问题出在条件编译的条件不满足,两个头文件一个都没有加载。

查找Python.h(python解压目录/include下)发现无该宏定义,推测宏定义在Python.h导入的头文件中

  1. #ifndef Py_PYTHON_H
  2. #define Py_PYTHON_H
  3. /* Since this is a "meta-include" file, no #ifdef __cplusplus / extern "C" { */
  4. /* Include nearly all Python header files */
  5. #include "patchlevel.h"
  6. #include "pyconfig.h"
  7. #include "pymacconfig.h"

继续查找发现其中一个头文件,python解压目录下pyconfig.h文件有关于此项的定义,但为注释状态

  1. [root@zheteng Python-3.7.7]# grep -n UUID pyconfig.h
  2. 1217:/* #undef HAVE_UUID_CREATE */
  3. 1220:/* #undef HAVE_UUID_ENC_BE */
  4. 1223:/* #undef HAVE_UUID_GENERATE_TIME_SAFE */
  5. 1226:/* #undef HAVE_UUID_H */
  6. 1229:/* #undef HAVE_UUID_UUID_H */

查看该代码,显然没有定义这个宏,所以头文件没有引入。

  1. /* Define to 1 if you have the <uuid/uuid.h> header file. */
  2. /* #undef HAVE_UUID_UUID_H */

当然好的方式是重新定义这个宏,但是考虑到网上都建议使用libuuid来编译,且本机已经安装了libuuid,那么一步到位,直接导入这个头文件即可。对_uuidmodule.c文件进行修改:

  1. >> vi _uuidmodule.c
  2. #include "Python.h"
  3. /* #ifdef HAVE_UUID_UUID_H */
  4. #include <uuid/uuid.h>
  5. /* #elif defined(HAVE_UUID_H)
  6. #include <uuid.h>
  7. #endif */

其他版本

解决过程中查找了一些资料,比较早的版本中_uuidmodule.c的上述条件编译代码是未考虑同时安装了uuid-devellibuuid的,所以会建议调整为上述条件编译代码(本节最初看到的),但是这里安装的3.7.7已经是按该条件编译代码发布更新了,具体情况具体分析,原因大体均为找不到uuid.h或uuid.h文件冲突。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/289554
推荐阅读
相关标签
  

闽ICP备14008679号