Centos7.6 安装Python3.11
问题:
在Centos7.6中,以手动方式(下载源码,make安装)安装Python3.11后,在运行pip安装库时会遇到ssl问题,错误类似如下:
There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/xpinyin/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
原因:
这是因为openssl版本不支持导致。在Centos7.6中,默认的openssl版本为 1.0.2,但python3.11需要openssl版本在1.1及以上才行(对python3.11.4进行测试后发现,openssl3是不行的,openssl1.1是可以的)。
提示: 可使用命令 openssl version 查看当前openssl版本。
解决方法:
1、手动重新安装openssl (参考文章:https://blog.csdn.net/qq_45028361/article/details/130801826)
1) 下载openssl
wget
https://www.openssl.org/source/openssl-1.1.1l.tar.gztar -zxvf
openssl-1.1.1l.tar.gz
cd openssl-3.0.7
2)编译安装
./config --prefix=/usr/local/openssl
make
make install
3)备份原配置
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl/ /usr/include/openssl.bak
4)新版配置
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
ln -s /usr/local/openssl/lib64/libssl.so.3 /usr/local/lib64/libssl.so
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
5)写入openssl库文件的搜索路径
echo "/usr/local/openssl/lib64" >> /etc/ld.so.conf
6)使修改后的/etc/ld.so.conf生效
ldconfig -v
到这里安装新版的openssl就完成 了,可以使用 openssl version 查看当前openssl版本了。
2、安装新版ssl安装后,重新编译安装python3.11源文件
( Centos7.6安装python3.11请参考 https://zhuanlan.zhihu.com/p/590965831)
请注意编译时需要指定安装文件位置以及添加 ' --with-openssl=<openssl文件位置>'的参数,类似如下命令:
./configure --prefix=/usr/local/python311 --with-openssl=/usr/local/openssl
make && make install
安装好后,可使用命令 python3 -c "import ssl; print(ssl.OPENSSL_VERSION)" 检查python是否可以正常加载ssl模块
Centos7.6, 指定调用自定义python库路径
在centos中,自定库如果要能随意调用 ,有2种方式 :
1、将库文件放入到python安装目录中的 site-packages 目录中
2、指定 $PYTHONPATH 变量路径, 具体操作:
1)编辑 ~/.bashrc 文件 ,以文件末尾加入:
export PYTHONPATH="/usr/local/python3_lib:$PATHONPATH";
保存并退出
2)更新文件:
source ~/.bashrc
Win10下同时安装Python2与Python3
1、下载python2、python3安装文件,直接安装
2、更改文件名:
Python2:
将 C:/python27/python.exe , C:/python27/pythonw.exe 分别改名为 C:/python27/python2.exe, C:/python27/pythonw2.exe
Python3:
将 C:/python311/python.exe , C:/python311/pythonw.exe 分别改名为 C:/python311/python3.exe, C:/python311/pythonw3.exe
3、重新安装python下的pip
python3 -m pip install --upgrade pip --force-reinstall
经过以上步骤,就可以分别运行Python2 与 Python3了。
Win11 python3.11安装pycurl
windows10/11,如果是3.7+以上版本,只能用whl安装pycurl库。
1)库下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pycurl
2)如果没有wheel库,需先安装wheel库
3)再通过 pip3 install <pycurl库名.whl>
Python3安装pycurl
Centos系统,python3.68,安装pycurl报错时可以提前安装gcc,curl-devel,python3-devel
yum install -y gcc curl-devel libcurl-devel python3-devel
Centos7系统,Python3.9,安装pycurl后在import pycurl报错:
ImportError: pycurl: libcurl link-time ssl backend (nss) is different from compile-time ssl backend (none/other)
解决方法:
pip uninstall pycurl
export PYCURL_SSL_LIBRARY=nss
pip install --compile --global-option="--with-nss" --no-cache-dir pycurl
Centos7系统安装Python3.9,参见文章 :
https://cloud.tencent.com/developer/article/2227719
调整自定义模块
调用不在同一文件夹或不在同一父文件夹的模块,主要是要让解释器找到你要调用模块的路径,这个路径是在sys.path中存放的。有2种方式:
1、在程序执行前,往sys.path列表中append你的模块路径
2、在lib/site-packages中新建一个 .pth后缀的文件,将调用模块的绝对路径写进去(路径以\\分隔)
配置自定义包路径
自定义python包:
1、在包文件夹中新建 __init__.py 文件
2、包文件夹父目录加入“PYTHONPATH”环境变量中
常见的几个依赖包
需求用yum安装的常见的几个依赖包:
python-devel
openssl-devel
libxml2,libxml2-devel
libxslt-devel
ImportError: pycurl: libcurl link-time ssl backend (nss) is different from compile-time ssl backend (none/other)
问题:
安装pycurl库后报错:
解决方法:
pip uninstall pycurl #卸载pycurl
export PYCURL_SSL_LIBRARY=[openssl|gnutls|nss] #错误中显示是 nss 则换成 nss
csv库生成的csv文件中文显示乱码
问题:python用csv库生成的csv文件中文显示乱码
解决方法:
在文件头部写入BOM(Byte order mark)文件标记,用来指出这个文件是UTF-8编码。
示例:
with open("e:/www/seotool%s"%filename,'wb') as csvFile:
writer = csv.writer(csvFile, delimiter=',',quotechar='|', quoting=csv.QUOTE_MINIMAL)
svFile.write('\xEF\xBB\xBF') #写入BOM,解决中文显示乱码
for record in csvList:
writer.writerow(record)
unicode编码写入txt文件
由于各种原因,你也许会有将unicode编码写到文件中的需求,当我们有decode('gb2312')将汉字解码为unicode后,可在IDLE中看到unicode编码,但写入到文件后,依然是汉字。
要将unicode编码写入到文件,需按如下操作:
m='上海1日游'
with open('unicode.txt','a+') as uc:
uc.write("%s\t%s\r\n"%(m,m.decode("gb2312").encode('unicode-escape'))) #需将解码后的字符用encode显式编码为unicode
类自身成员是被各个实例共享的
类自身成员是被各个实例共享的.
http://zhidao.baidu.com/link?url=zJ9Tfwt9c_LvnKnDUX46YQUDu1F41KSWQXl-mXXl0tV1-_ITn9WgQ_Pntna7OneicxQlijeedK49iZleet9qO7q496-MH5k82IWZr0LVCXK
__getattribute__、__setattr__、__delattr__
通过下面三个方法,可实现动态改变类中元素(动态定义变量等):
__getattribute__
__setattr__
__delattr__
注意:这三个方法继承自类object,如果你想使你的类拥有这三个方法,请将object作为父类
Linux下,python安装setuptools时,提示ERROR:RuntimeError: Compression requires the (missing) zlib module
解决方法
先用yum安装zlib与zlib-devel工具:
# yum install zlib
# yum install zlib-devel
重新编译python(make,make install就行,不用删除)
修改默认编码
查看当前默认编码(这是解决编码问题的前提呀):
import sys
sys.getdefaultencoding()
因为用IDLE编写的程序文件,默认的是‘ASCII',且用 ascii 解码器来对获取的字符进行解码,ascii能解码的字符太有限,这是“UnicodeEncodeError: 'ascii' codec can't encode characters in position......” 报错的原因 (网上的解决办法真的是各种坑!!)
更改默认编码为UTF-8(仅实践 python2.7.5):
新建文件 Python27\Lib\site-packages\sitecustomize.py
import sys
sys.setdefaultencoding('utf-8')
再查看一下默认编码吧,是不是已经是UTF8了。