Python常见问题

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.gz
tar -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库后报错:

ImportError: pycurl: libcurl link-time ssl backend (nss) is different from compile-time ssl backend (none/other)

解决方法:

pip uninstall pycurl #卸载pycurl

export PYCURL_SSL_LIBRARY=[openssl|gnutls|nss]     #错误中显示是 nss 则换成 nss

pip install pycurl   

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安装zlibzlib-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了。