2021-07-21

本文介绍了在Ubuntu和CentOS系统中编译安装Python时遇到的问题及其解决方法,包括安装必要的库和修复`setupterm`错误。同时,详细阐述了如何从源代码编译安装OpenSSL,并将编译好的OpenSSL链接到Python的配置中,以确保顺利进行Python的编译过程。

编译安装Python所需lib库

Ubuntu

sudo apt-get install libdb5.3-dev libgdbm-dev
sudo apt-get install libbz2-dev
sudo apt-get install libexpat1-dev
sudo apt-get install liblzma-dev
sudo apt-get install libreadline6-dev
sudo apt-get install libsqlite3-dev
sudo apt-get install libncurses5-dev
sudo apt-get install libncursesw5-dev
sudo apt-get install uuid-dev
sudo apt-get install libc6-dev zlib1g-dev

Python3.14
sudo apt-get install libssl-dev libzstd-dev
sudo apt-get install libffi-dev tk-dev wget curl
sudo apt-get install build-essential

./configure --prefix=/usr/local/python3.14 --enable-optimizations

CentOS

yum -y install bzip2 bzip2-devel
yum install sqlite-devel
yum install readline-devel
yum -y install libffi libffi-devel
yum install zlib*
yum -y install xz lzma xz-devel
yum -y install gdbm gdbm-devel
yum -y install tk tk-devel
yum install ncurses-devel
yum install uuid-devel

错误修改

Python-3.9.0/Modules/_cursesmodule.c:3240:35: error: implicit declaration of function ‘setupterm’; did you mean ‘set_term’? [-Werror=implicit-function-declaration]
if (!initialised_setupterm && setupterm((char *)term, fd, &err) == ERR) {

sed -i “s/Werror=implicit-function-declaration/Wno-error/g” configure(修改configure文件)
sudo make clean
sudo make

安装OpenSSL

  1. #sudo apt-get install openssh-server

  2. #wget https://www.openssl.org/source/openssl-1.1.1h.tar.gz
    ./config --prefix=/usr/local/openssl no-zlib

  3. #sudo make -j4

  4. #sudo make install

  5. #mv /usr/bin/openssl /usr/bin/openssl.bak

  6. #ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

  7. #ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/local/lib/libssl.so

  8. #ln -s /usr/local/openssl/include/openssl /usr/include/openssl

  9. #echo “/usr/local/openssl/lib” >> /etc/ld.so.conf

  10. #ldconfig -v

  11. #openssl version

Rebuild Python
12. ./configure --with-openssl=/usr/local/openssl

在 Perl 中,使用 `==` 运算符比较字符串时,Perl 会尝试将字符串隐式转换为数字进行数值比较。这种行为可能导致不符合预期的结果,因为日期时间字符串通常无法直接转换为有意义的数值。 对于以下两段代码的行为差异: 1. `'2021-07-21 00:00:00' == '2025-08-13 00:00:00'` 输出 `test` 2. `'2025-07-21 00:00:00' == '2025-08-13 00:00:00'` 不输出 `test` ### 原因分析 #### 数值转换规则 当 Perl 遇到非纯数字的字符串并试图将其转换为数值时,它会从左到右解析字符,直到遇到第一个无法识别为数字的部分为止。例如: - `'2021-07-21 00:00:00'` 被转换为 `2021`(忽略后面的 `-07-21...`) - `'2025-08-13 00:00:00'` 同样被转换为 `2025` 因此,表达式 `'2021-07-21 00:00:00' == '2025-08-13 00:00:00'` 实际上等价于 `2021 == 2025`,结果为假(不输出 `test`)。 然而,如果某些情况下两个字符串都被转换成相同的数值,则可能会出现意外的“相等”判断。例如: - 如果两个字符串都以相同的前缀开始,并且后续字符导致相同的数值截断,则可能误判为真。 #### 具体案例解释 - `'2021-07-21 00:00:00' == '2025-08-13 00:00:00'` 的比较实际上是在比较 `2021` 和 `2025`,结果为假。 - `'2025-07-21 00:00:00' == '2025-08-13 00:00:00'` 的比较实际上是在比较 `2025` 和 `2025`,结果为真,因此输出 `test` [^1]。 ### 正确的字符串比较方式 为了正确比较日期字符串,应使用 `eq` 运算符进行字符串比较,而不是 `==`。例如: ```perl if ('2021-07-21 00:00:00' eq '2025-08-13 00:00:00') { print "test\n"; } ``` 这样可以确保比较是基于完整的字符串内容,而不是数值转换后的部分数据 [^1]。 ### 示例代码 ```perl # 错误的比较方式(使用数值比较) if ('2025-07-21 00:00:00' == '2025-08-13 00:00:00') { print "test\n"; # 输出 test } # 正确的比较方式(使用字符串比较) if ('2025-07-21 00:00:00' eq '2025-08-13 00:00:00') { print "test\n"; # 不输出 } ``` ### 总结 - 使用 `==` 会导致 Perl 将字符串转换为数值进行比较,这可能会产生错误的结果。 - 使用 `eq` 可以确保字符串按字面意义进行比较,避免因数值转换而导致的误判。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值