[Exchange and share] 安装python3.12踩坑笔记
Tofloor
poster avatar
xia
deepin
2023-10-08 04:40
Author

系统信息:Linux liuxia-PC 6.1.32-amd64-desktop-hwe #23.01.00.20 SMP PREEMPT_DYNAMIC Mon Sep 11 14:16:03 CST 2023 x86_64 GNU/Linux

最近,python3.12,下载来看看,过程中踩了一些坑,这里留个笔记,希望能对大家有用。

建议安装的时候指定安装目录。之前编译安装3.11的时候,使用默认设置(/usr/local),现在装3.12的时候想卸载3.11,发现安装文件和其他的应用混在一起,不太好清除。指定安装目录后,下次装3.13的时候,卸载老版本可以直接删除安装目录,调整/usr/local/bin下的python3、pip3的软链接的指向就行了。

过程:

./configure --prefix=$HOME/python3.12
make

make altinstall

使用altinstall,不会修改系统内的python3指向,默认指向安装的版本。

安装后有一个问题,就是进到交互模式后,方向键、退格键不能用:

Python 3.12.0 (main, Oct  7 2023, 17:25:28) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>a=int()^[[D^[[D^[[D^[[D

然后安装gnureadline,安装过程中又报错:

gcc -shared build/temp.linux-x86_64-cpython-312/Modules/3.x/readline.o readline/libreadline.a readline/libhistory.a -lncurses -o build/lib.linux-x86_64-cpython-312/gnureadline.cpython-312-x86_64-linux-gnu.so
……
/usr/bin/ld: 找不到 -lncurses: 没有那个文件或目录
……

网上检索错误信息,得知ncurses是一套编程库,-lncurses参数是链接这个库,估计是缺依赖了
于是

apt search libncurses

搜索一下

正在排序... 完成
全文搜索... 完成
libncurses-dev/未知,now 6.3-1 amd64 
developer's libraries for ncurses
libncurses5/未知,now 6.3-1 amd64 
shared libraries for terminal handling (legacy version)
libncurses5-dbgsym/未知 6.3-1 amd64
debug symbols for libncurses5
libncurses5-dev/未知 6.3-1 amd64
transitional package for libncurses-dev
……

发现有几个版本,试试不带5的那个吧~

sudo apt install libncurses

安装成功。再安装gnureadline也成功,然后进python3.12的交互模式也正常了

另外:如果安装时候如果开启了共享

sudo ./configure --prefix=$HOME/python3.12 --enable-optimizations --with-lto --enable-shared --with-dbmliborder=gdbm

安装完成后需要将$HOME/python3.12/lib加入到环境变量文件/etc/ld.so.conf的最后一行,并执行ldconfig,不然启动python的时候会提示libpython3.12.so.1.0找不到的错误(网上说的将HOME/python3.12/lib/libpython3.12.so.1.0复制到/usr/lib目录下貌似行不通)。

Reply Favorite View the author
All Replies
阿尼樱奈奈
Moderator
2023-10-08 04:42
#1

ok

Reply View the author
ThinkYoung
deepin
2023-10-08 04:57
#2

kissing_heart 刚发布就拿下了!厉害呀!

Reply View the author
一只小H
deepin
2023-10-08 05:02
#3

这么装不加参数会缺东西的吧,比如sqlite

Reply View the author
Feng Yu
deepin
2023-10-08 17:29
#4

conda不香吗?

Reply View the author
xia
deepin
2023-10-09 00:37
#5
一只小H

这么装不加参数会缺东西的吧,比如sqlite

是的。编译的时候报了非致命的错误

The necessary bits to build these optional modules were not found:
_bz2                  _dbm                  _gdbm
_lzma                 _tkinter              readline
To find the necessary bits, look in configure.ac and config.log.

对照缺项,把一下依赖安装一下:

sudo apt install libncurses-dev libreadline-dev libsqlite3-dev tk-dev libgdbm-dev liblzma-dev libbz2-dev

libreadline-dev可以避免进入交互之后方向键不可用的问题。安装libsqlite3-dev,sqlite3就能用了。

说句实话linux上的python不能说是“自带电池”~~~

Reply View the author
xia
deepin
2023-10-10 00:42
#6

最后总结一下我的安装流程:

sudo apt update
sudo apt upgrade

sudo apt install build-essential gdb lcov pkg-config
libbz2-dev libffi-dev libgdbm-dev libgdbm-compat-dev liblzma-dev
libncurses5-dev libreadline6-dev libsqlite3-dev libssl-dev
lzma lzma-dev tk-dev uuid-dev zlib1g-dev

(上面这些依赖来自python的官方开发指南)

说明:安装一些依赖,不然安装的过程中会出错(例如libncurses-dev),或者避免编译出来的python有问题(例如不装libreadline-dev,安装后,进入交互模式下方向键不可用),或者导致标准库模块不可用(例如不装libsqlite3-dev,安装后python找不到模块sqlite3)

sudo ./configure --prefix=$HOME/python3.12 --enable-optimizations --with-lto --enable-shared --with-dbmliborder=gdbm
说明:
--prefix:指定安装路径,便于日后卸载
--enable-optimizations --with-lto:性能优化选项
--enable-shared:构建共享库,便于其他软件调用python的库
--with-dbmliborder=gdbm:避免make的时候报找不到_dbm(官方github的issue里有讨论)

make -j2
说明:-j2:我的电脑是双核的,所以加参数-j2,提高便于速度

make altinstall
说明:altinstall:安装时不覆盖系统原来的python3指向。

sudo vim /etc/ld.so.conf
说明:将路径 $HOME/python3.12/lib 加入最后一行,使得系统能够找到libpython3.12.so.1.0
ldconfig
说明:是环境变量改变生效

进入源码的doc文件夹
make html
编译文档,在_build/html目录下找到index.html,这个就是离线文档了

Reply View the author
一只小H
deepin
2023-10-13 02:57
#7
xia

是的。编译的时候报了非致命的错误

The necessary bits to build these optional modules were not found:
_bz2                  _dbm                  _gdbm
_lzma                 _tkinter              readline
To find the necessary bits, look in configure.ac and config.log.

对照缺项,把一下依赖安装一下:

sudo apt install libncurses-dev libreadline-dev libsqlite3-dev tk-dev libgdbm-dev liblzma-dev libbz2-dev

libreadline-dev可以避免进入交互之后方向键不可用的问题。安装libsqlite3-dev,sqlite3就能用了。

说句实话linux上的python不能说是“自带电池”~~~

我编译的是python 3.10,应该没有太大差别,deepin 20.9自带的ssl貌似版本不够,你的方法在20.9下可能会不行,需要自己编译一份openssl,在参数里面指定

这是我的编译参数

./configure --prefix=/opt/Python-3.10.12 --enable-optimizations --with-openssl= CC=/usr/bin/clang-15 CXX=/usr/bin/clang++-15 LLVM_PROFDATA=/usr/bin/llvm-profdata-15 CFLAGS="-Wno-unused-value -Wno-empty-body -Qunused-arguments -I/usr/local/include" LDFLAGS="-L/usr/local/lib" --enable-loadable-sqlite-extensions

--enable-loadable-sqlite-extensions 这个参数不加貌似编译也不出错,但用到的时候会出问题

Reply View the author
176******60
deepin
2023-10-13 09:19
#8

python3.12.0下载地址:https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz
(vvv)(deepin内的python是自带的,无法升级,可自行安装)安装python3.12步骤:
下载编译安装
sudo apt -y install wget
wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz
解压缩到指定python3.12.0安装路径 cd ~/Downloads && sudo tar -xvf Python-3.12.0.tgz -C /usr/local/
切换到解压缩后的文件夹下 cd /usr/local/Python-3.12.0/
#sudo ./configure --prefix=/usr/local/python3.12 --with-openssl=/usr --with-http_ssl_module --enable-optimizations
编译 sudo make
安装 sudo make install或sudo make altinstall 也可合并 sudo make && sudo make install
安装后清理 sudo make clean && sudo apt autoremove
修改环境变量 sudo vim /etc/profile 或 sudo deepin-editor /etc/profile
追加以下内容
export PYTHON3_HOME=/usr/local/python3.12
export PATH=​PYTHON3_HOME/bin:PATH 或 export PATH=​{PYTHON3_HOME}/bin:PATH
配置环境变量立即生效:source /etc/profile
添加新python3软链接指向 sudo ln -snf /usr/local/python3.12/bin/python3 /usr/bin/python3

Reply View the author
xia
deepin
2023-10-18 02:56
#9
176******60

python3.12.0下载地址:https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz
(vvv)(deepin内的python是自带的,无法升级,可自行安装)安装python3.12步骤:
下载编译安装
sudo apt -y install wget
wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz
解压缩到指定python3.12.0安装路径 cd ~/Downloads && sudo tar -xvf Python-3.12.0.tgz -C /usr/local/
切换到解压缩后的文件夹下 cd /usr/local/Python-3.12.0/
#sudo ./configure --prefix=/usr/local/python3.12 --with-openssl=/usr --with-http_ssl_module --enable-optimizations
编译 sudo make
安装 sudo make install或sudo make altinstall 也可合并 sudo make && sudo make install
安装后清理 sudo make clean && sudo apt autoremove
修改环境变量 sudo vim /etc/profile 或 sudo deepin-editor /etc/profile
追加以下内容
export PYTHON3_HOME=/usr/local/python3.12
export PATH=​PYTHON3_HOME/bin:PATH 或 export PATH=​{PYTHON3_HOME}/bin:PATH
配置环境变量立即生效:source /etc/profile
添加新python3软链接指向 sudo ln -snf /usr/local/python3.12/bin/python3 /usr/bin/python3

这样能过,但是有些模块是缺的

Reply View the author
pho
deepin
2023-12-09 06:15
#10

以上的内容也是我关心的,楼主做的不错。希望论坛出一个deepin系统安装python3.12等的完美版指引。

Reply View the author
pho
deepin
2023-12-10 21:28
#11

最后运行有问题吗?--enable-shared就会有找不到libpython3.12.so.1.0。但是没有--enable-shared,则用pyinstaller打包成功。

你这个流程我比较了各种版本的安装,你这个不错。希望能出一个图文版的。

Reply View the author
pho
deepin
2023-12-11 04:18
#12
176******60

python3.12.0下载地址:https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz
(vvv)(deepin内的python是自带的,无法升级,可自行安装)安装python3.12步骤:
下载编译安装
sudo apt -y install wget
wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz
解压缩到指定python3.12.0安装路径 cd ~/Downloads && sudo tar -xvf Python-3.12.0.tgz -C /usr/local/
切换到解压缩后的文件夹下 cd /usr/local/Python-3.12.0/
#sudo ./configure --prefix=/usr/local/python3.12 --with-openssl=/usr --with-http_ssl_module --enable-optimizations
编译 sudo make
安装 sudo make install或sudo make altinstall 也可合并 sudo make && sudo make install
安装后清理 sudo make clean && sudo apt autoremove
修改环境变量 sudo vim /etc/profile 或 sudo deepin-editor /etc/profile
追加以下内容
export PYTHON3_HOME=/usr/local/python3.12
export PATH=​PYTHON3_HOME/bin:PATH 或 export PATH=​{PYTHON3_HOME}/bin:PATH
配置环境变量立即生效:source /etc/profile
添加新python3软链接指向 sudo ln -snf /usr/local/python3.12/bin/python3 /usr/bin/python3

这个安装完毕后,如果使用pyinstaller,会提示建议重新编译,要有这个--enable-shared

Reply View the author