跳至主要內容

Python 相关

程序员李某某大约 7 分钟

Python 相关

Linux 安装

Ubuntu安装

apt update
apt upgrade
apt install python3

源码编译安装

#!/bin/bash

#只是将python3.12.3的安装包下载到 /root目录下
cd /root
#下载最新的软件安装包
wget https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tgz
#解压缩安装包
tar -xzf Python-3.12.3.tgz
#安装源码编译需要的编译环境
yum -y install gcc zlib zlib-devel libffi libffi-devel
#可以解决后期出现的方向键、删除键乱码问题,这里提前避免。
yum install readline-devel
#解决No module named '_bz2'
yum install bzip2-devel
#安装openssl之前先安装这个
yum install epel-release
#安装openssl11,后期的pip3安装网络相关模块需要用到ssl模块。
yum install openssl-devel openssl11 openssl11-devel
#设置编译FLAG,以便使用最新的openssl库
export CFLAGS=$(pkg-config --cflags openssl11)
export LDFLAGS=$(pkg-config --libs openssl11)
#进入刚解压缩的目录
cd /root/Python-3.12.3
#1.不指定python安装目录(使用默认python安装目录)
#因为:不建议加--prefix=/usr/python,这样会导致你后续pip安装的可执行文件
#(比如virtualenv)都放在/usr/python/bin而不是默认的/usr/bin里面,不能直接用,还得逐个ln
#2.使用--with-openssl=<path_to_openssl>
# 可以通过使用which openssl查看openssl的安装路径
# 我这里是/usr/bin/openssl
# 最后的指令如下
./configure --with-openssl=/usr/bin/openssl
#然后就算源码编译并安装了,时间会持续几分钟。
make
make install
#指定链接,此后我们系统的任何地方输入python3就是我们安装的
ln -s /usr/local/bin/python3.12 /usr/bin/python3
ln -s /usr/local/bin/pip3 /usr/bin/pip3
#pip3安装包
pip3 install virtualenv
#指定virtualenv的链接
ln -s /usr/local/bin/virtualenv /usr/bin/virtualenv
#这个最新版python3了
python3 -V

pip切换源

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

## 查看
pip config list

临时换源

#清华源
pip install markdown -i https://pypi.tuna.tsinghua.edu.cn/simple
# 阿里源
pip install markdown -i https://mirrors.aliyun.com/pypi/simple/
# 腾讯源
pip install markdown -i http://mirrors.cloud.tencent.com/pypi/simple
# 豆瓣源
pip install markdown -i http://pypi.douban.com/simple/

永久换源

# 清华源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 阿里源
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
# 腾讯源
pip config set global.index-url http://mirrors.cloud.tencent.com/pypi/simple
# 豆瓣源
pip config set global.index-url http://pypi.douban.com/simple/# 换回默认源pip config unset global.index-url

安装 Conda

Windows

更改环境默认创建位置

conda创建虚拟环境的路径为:C:\Users\username.conda\envs\

conda下载的安装包路径:C:\Users\username.conda\pkgs\

在 C:\Users\username 目录下找到.condarc文件 修改

## 原内容保留,添加
envs_dirs:
  - D:\dev\anaconda\envs
pkgs_dirs:
  - D:\dev\anaconda\pkgs

完事以后对这两个目录添加修改权限(目录右键属性里面)

安装 miniconda

mkdir -p ~/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm ~/miniconda3/miniconda.sh
source ~/.bashrc

若未生效 编辑 ~/.bashrc

vi ~/.bashrc
###### 添加环境变量 ######
export PATH="/root/miniconda3/bin:$PATH"
#########################
source ~/.bashrc

刪除

rm -rf ~/miniconda3
rm -f ~/.condarc
rm -rf ~/.conda
rm -rf ~/.continuum

从系统 PATH 中移除 Conda 如果你在 ~/.bashrc~/.bash_profile~/.zshrc 等文件中添加了 Conda 的路径,需要手动编辑这些文件,删除与 Conda 相关的行。你可以使用文本编辑器打开这些文件,例如:

nano ~/.bashrc
# 或者
nano ~/.zshrc

常用命令

## 创建虚拟环境
conda create -n chatchat python=3.10
## 环境列表
conda env list
## 切换环境
conda activate myenv

## 回到基础环境
conda activate base
## 退出环境
conda deactivate

## 删除环境
conda env remove -n myenv

docker 安装

docker run -i -t -p 8888:8888 continuumio/anaconda3 /bin/bash -c " \
    pip install jupyterlab-language-pack-zh-CN && \
    conda install jupyter  -y --quiet && \
    mkdir -p /opt/notebooks && \
    jupyter notebook \
    --notebook-dir=/opt/notebooks --ip='*' --port=8888 \
    --no-browser --allow-root --NotebookApp.token=123456"
## 若没指定token, 查看
jupyter notebook list --json



docker run -p 8888:8888 -e JUPYTER_TOKEN="123456" jupyter/scipy-notebook bash -c  "pip install jupyterlab-language-pack-zh-CN && jupyter notebook"

设置

## 查看配置信息
conda config --show
## 改配置
conda config --set auto_activate_base false

换源

报错 Multiple Errors Encountered. 换源

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes

内网开发

下载包

# -d 指定下载保存的目录
pip download nose-allure-plugin==1.0 -d  D:\tools\python\allure-packages  

生成 requirements.txt

# coding: utf-8

import re,os

dirpath = "D:\\tools\\python\\allure-packages" # 模块包的路径

requirementpath = "D:\\tools\\python\\requirement.txt"  # requirement.txt保存路径

filelist = os.popen('dir '+dirpath).readlines() # 执行CMD命令dir,查看模块路径下的所有文件列表

with open(requirementpath, 'w+') as f:

    for filename in filelist[7:-2]:
        #print(filename)
        print(filename.split()[-1].split('-')[0]+'=='+filename.split()[-1].split('-')[1].strip(".tar.gz"))
        f.write(filename.split()[-1].split('-')[0]+'=='+filename.split()[-1].split('-')[1].strip(".tar.gz")+'\n')

内网安装

pip install --no-index --find-links=D:\tools\python\allure-packages -r D:\tools\python\requirement.txt
# --find-links 指定查找模块包的路径,根据自己解压的目录自行修改
# -r 指定requirement.txt文件路径,根据自己存放的路径自行修改
# pip 将根据requirement.txt列出的模块包和版本号,去--find-links配置的路径下查找对应的安装包进行安装
# 查看
pip list

打包可执行文件

  • PyInstaller:跨平台打包工具
  • cx_Freeze:跨平台打包工具
  • py2exe:Windows平台打包工具
  • py2app:Mac平台打包工具
  • Nuitka:跨平台打包工具,它可以生成C或C++代码,并通过编译生成可执行文件。

PyInstaller

官方文档open in new window

安装于简单使用

pip install pyinstaller
PyInstaller main.py
## 生成 dist/your_script/your_script.exe(Windows)或无扩展名(Linux/Mac)
## 默认会生成一个文件夹,里面有 exe 和所有依赖

参数

  • -F:打包成exe文件
  • -w:打包成exe文件,但是不显示控制台
  • -i icon.ico:添加图标,或--icon=icon.ico
  • -n appname:添加exe文件名,或--name=appname
  • --onefile:打包到一个文件
  • -add-data "src;src"(源路径;目标路径):添加数据源,Windows下使用;Linux/Mac下使用:
  • --hidden-import=pandas:添加依赖包
  • --clean:打包前清理临时文件
  • --distpath=xxx:指定输出目录
  • --collect-all:添加依赖包(见下踩坑)
  • --collect-submodules:添加依赖包(见下踩坑)
  • --collect-data:添加依赖包(见下踩坑)

踩坑

  • numpy、sklearn等科学计算库,含C 扩展库,需要使用--collect-all、--collect-submodules、--collect-data等参数,才能正确打包。

  • from引包不要使用相对路径

  • fastapi启动命令:uvicorn src.main:app 要从打包到的目标路径开始指定

脚本示例

import os
import sys
import platform
from setuptools import setup, Command


class BuildBinaryCommand(Command):
    description = "Build binary with PyInstaller (Windows & Linux), auto-include requirements"
    user_options = []

    def initialize_options(self):
        pass

    def finalize_options(self):
        pass

    def run(self):
        # 路径分隔符
        sep = ';' if platform.system() == 'Windows' else ':'
        add_data = f"src{sep}src"

        # 读取 requirements.txt 依赖(仅用于提醒用户安装,不影响 PyInstaller 打包)
        if os.path.exists("requirements.txt"):
            print("请确保已运行 pip install -r requirements.txt 安装所有依赖!")

        # 生成 pyinstaller 命令
        cmd = (
            f"pyinstaller --onefile --add-data {add_data} "
            f"--hidden-import=uvicorn --hidden-import=fastapi "
            f"--hidden-import=pandas --hidden-import=numpy --hidden-import=joblib "
            f"--collect-all sklearn "
            f"--collect-submodules sklearn "
            f"--collect-data sklearn "
            f"--collect-submodules numpy "
            f"--collect-data numpy "
            f"--collect-submodules pandas "
            f"--collect-data pandas "
            f"--hidden-import=scipy --hidden-import=pythonjsonlogger --hidden-import=dotenv "
            f"--hidden-import=category_encoders "
            f"--hidden-import=optuna --hidden-import=hyperopt --hidden-import=tqdm --hidden-import=multipart "
            f"--name disaster_relief_service src/api/app.py"
        )
        print(f"Running: {cmd}")
        os.system(cmd)


setup(
    name="disaster_relief_algorithms",
    version="1.0.0",
    description="Disaster Relief Algorithms Service",
    packages=["src"],
    install_requires=[],  # 依赖请在requirements.txt维护
    cmdclass={
        'build': BuildBinaryCommand,
    },
)

执行python setup.py build

报错

Linux 下报错:

ERROR: On Linux, objdump is required. It is typically provided by the 'binutils' package installable via your Linux distribution's package manager.

PyInstaller 在 Linux 下需要 objdump 工具,而它属于 binutils 包。

## CentOS/RedHat
yum install binutils -y
## Ubuntu/Debian
sudo apt-get update
sudo apt-get install binutils -y

在Linux中执行报错如下:

Failed to load Python shared library '/tmp/MEIBYEYF/libpython3.12.so': /lib/x86_64-linux-gnu/libm.so.6: version 'GLIBC_2.38' not found (required by /tmp/MEIBY8EYF/libpython3.12.so)

原因分析:

  • 在GLIBC 2.38(或更高)环境下打包(如较新的Ubuntu),但在GLIBC 2.38以下的Linux上运行(如Debian 11/Ubuntu 22.04等)。
  • PyInstaller会把本地Python解释器的动态库(如libpython3.12.so)一起打包,运行时依赖本地的libc(glibc)版本。
  • 低版本Linux系统的glibc不兼容高版本编译出来的二进制。 解决方案

检查目标系统glibc版本 在目标Linux上运行:

ldd --version

如果低于2.38,必须在同等或更低版本glibc的系统上打包。

在目标环境或比目标环境更老的Linux(如Ubuntu 20.04、Debian 10/11)上打包。这样打包出来的程序能兼容更多老系统。 推荐用 Docker 容器来打包,保证环境一致性。 示例:用 Ubuntu 20.04 容器打包

docker run --rm -it -v "$PWD":/src ubuntu:20.04 bash
# 容器内执行
apt update && apt install -y python3 python3-pip python3-venv build-essential
pip3 install pyinstaller
cd /src
pyinstaller your_script.py
上次编辑于:
贡献者: 李元昊,liyuanhao