Python多版本及包安装的问题

使用PyCharm,可以解决各种版本问题…




brew

brew卸载python


要卸载通过Homebrew安装的Python,可以执行以下步骤:

  1. 打开终端。

  2. 运行以下命令,以查看系统上安装的所有Python版本:

brew list | grep python

该命令会输出所有以 “python” 开头的包,其中可能包括多个Python版本。

  1. 运行以下命令,以卸载指定的Python版本:

brew uninstall python@<version>

其中, 是要卸载的Python版本号,例如 3.9、3.8 等。如果你不确定要卸载哪个版本,可以在第2步中查看系统上安装的所有Python版本。

  1. 如果你安装了 pip,也可以使用以下命令卸载它:

brew uninstall pipenv

这将卸载 pipenv,以及所有通过 pipenv 安装的 Python 包。

  1. 如果你想完全卸载 Homebrew,可以运行以下命令:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"

这将卸载 Homebrew,以及所有通过 Homebrew 安装的软件包。请注意,此命令将完全删除 Homebrew,包括它所安装的任何软件包。因此,如果你只想卸载 Python,不想删除 Homebrew 和其他软件包,请不要运行此命令。


pyenv


brew install pyenv

如果下载太慢,可以浏览器下载下来,放到这个目录,执行 python install -v 下载包


mac下使用pyenv

使用pyenv install 一些特定版本时会报错,

https://issueantenna.com/repo/pyenv/pyenv/issues/2284

苹果的锅..

可以安装上图指定的这几个已修复的版本

pyenv-virtualenv 属于锦上添花,不是很必要,可参考pyenv,让你轻松切换各种python版本

mac m1只支持到3.8

想安装3.8以下的会有点麻烦~



pyenv或conda

在 macOS 上,你可以使用多个工具来管理和切换 Python 版本。以下是两种常用的方法:

  1. pyenv:
    pyenv 是一个轻量级的 Python 版本管理工具,可以在 macOS 上安装和管理多个 Python 版本。使用 pyenv,你可以轻松地切换系统中使用的默认 Python 版本,也可以为每个项目选择特定的 Python 版本。

    首先,使用 Homebrew 安装 pyenv:

    1
    brew install pyenv

    安装完成后,你可以使用以下命令来安装和切换 Python 版本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 安装特定版本的 Python
    pyenv install <version>

    # 切换全局默认 Python 版本
    pyenv global <version>

    # 在当前 shell 中切换 Python 版本
    pyenv shell <version>

    # 在项目目录中设置特定 Python 版本
    pyenv local <version>

    替换 <version> 为你想要安装或切换到的 Python 版本号。

  2. conda:
    conda 是一个流行的环境和包管理器,可以用于在 macOS 上安装和管理多个 Python 版本。使用 conda,你可以创建独立的 Python 环境,并在每个环境中选择不同的 Python 版本。

    如果你已经安装了 Anaconda 或 Miniconda,可以使用以下命令来创建和管理环境:

    1
    2
    3
    4
    5
    6
    7
    8
    # 创建一个新的 Python 环境
    conda create -n myenv python=<version>

    # 激活环境
    conda activate myenv

    # 切换 Python 版本
    conda install python=<version>

    替换 <version> 为你想要安装或切换到的 Python 版本号。

    如果尚未安装 Anaconda 或 Miniconda,你可以从 Anaconda 官方网站下载适合 macOS 的 Anaconda 或 Miniconda 安装程序,并按照安装说明进行安装。

无论你选择使用 pyenv 还是 conda,这些工具都提供了灵活的方式来安装、切换和管理不同版本的 Python。根据你的需求和偏好,选择其中一种工具即可。





20240810补记:

linux上面用venv


比如如果某个requirements.txt需要使用python3.8才能执行

1
2
3
pip install virtualenv
virtualenv -p /usr/bin/python3.8 venv (要注意这里是venv还是.venv)
source venv/bin/activate

每次用都要source一下


但这样有个坑,如果要对某个python脚本配置定时任务,如

1
*/15 * * * *  cd /home/ubuntu/chenjun_script && source venv/bin/activate && python /home/ubuntu/chenjun_script/user_portrait_contract_prod.py >> /home/ubuntu/chenjun_script/user_portrait_contract_prod.log

source venv/bin/activate 其实是没效果的…因为crontab不认shell的环境变量…

需要 写个脚本,然后在crontab里执行那个脚本

1
0 10 * * 1   cd /home/ubuntu/chenjun_script && /home/ubuntu/chenjun_script/use_venv.sh  && python /home/ubuntu/chenjun_script/db_data_cmp.py  >> /home/ubuntu/chenjun_script/db_data_cmp.log 

实际上我用这种方式测了下好像也不行…还是老老实实用下面的,指定python版本

1
0 10 * * 1   cd /home/ubuntu/chenjun_script &&  python3.9 /home/ubuntu/chenjun_script/db_data_cmp.py  >> /home/ubuntu/chenjun_script/db_data_cmp.log 

linux定时任务执行没结果,手动执行有结果问题总结

分享一次Linux任务计划crontab不执行的问题排查过程


crontab中需要source venv/bin/activate ,直接写在crontab中好像不生效,需要如何操作?


在 crontab 中使用 source venv/bin/activate 来激活虚拟环境确实可能会遇到问题。这是因为 crontab 任务是在一个独立的环境中运行的,无法直接访问你的 shell 环境变量。

有几种解决方案:

  1. 使用 bash 脚本

    可以创建一个 bash 脚本文件,在脚本中激活虚拟环境,然后在 crontab 中调用这个脚本。

    1
    2
    3
    #!/bin/bash
    source /path/to/venv/bin/activate
    # 在这里写你的任务代码

    将这个脚本保存为 cron_task.sh,然后在 crontab 中使用:

    1
    * * * * * /path/to/cron_task.sh
  2. 使用 shell 登录方式

    在 crontab 中使用 bash -l -c 来以登录 shell 的方式运行任务,这样就可以读取到正确的环境变量。

    1
    * * * * * bash -l -c 'source /path/to/venv/bin/activate && python /path/to/script.py'
  3. 设置环境变量

    在 crontab 条目的开头设置所需的环境变量,这样就不需要 source 了。

    1
    2
    3
    VIRTUAL_ENV=/path/to/venv
    PATH=$VIRTUAL_ENV/bin:$PATH
    * * * * * python /path/to/script.py
  4. 使用 systemd 服务

    如果你的系统使用 systemd,可以创建一个 systemd 服务单元来运行任务,并在服务文件中设置好虚拟环境。这样可以确保任务在正确的环境中运行。

总之,在 crontab 中使用虚拟环境需要一些额外的处理,上述方法都可以有效解决这个问题。具体选择哪种方式,可以根据你的系统环境和个人习惯来决定。


ubuntu 18.04如何使用pyenv安装python3.10

好的,我理解你想在Ubuntu 18.04上使用pyenv安装Python 3.10。这是一个很好的选择,因为pyenv可以让你管理多个Python版本而不影响系统自带的Python。让我们一步步来完成这个过程:

  1. 首先,安装pyenv所需的依赖:

    1
    2
    3
    4
    sudo apt update
    sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
    libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
    xz-utils tk-dev libffi-dev liblzma-dev python-openssl git
  2. 使用curl安装pyenv:

    1
    curl https://pyenv.run | bash
  3. 设置环境变量。将以下行添加到你的~/.bashrc文件末尾:

    1
    2
    3
    export PATH="$HOME/.pyenv/bin:$PATH"
    eval "$(pyenv init --path)"
    eval "$(pyenv init -)"

注意!不是执行这三行命令,而是把这三行加到~/.bashrc文件中!!


  1. 重新加载shell配置:

    1
    source ~/.bashrc
  2. 验证pyenv安装:

    1
    pyenv --version
  3. 使用pyenv安装Python 3.10:

    1
    pyenv install 3.10.0

    注意:这个过程可能需要一些时间,因为它会从源代码编译Python。

  4. 设置Python 3.10为全局版本(可选):

    1
    pyenv global 3.10.0
  5. 验证安装:

    1
    python --version

    这应该显示”Python 3.10.0”或你安装的具体版本。

  6. 如果你只想在特定项目中使用Python 3.10,你可以在项目目录中运行:

    1
    pyenv local 3.10.0

这样,你就成功使用pyenv在Ubuntu 18.04上安装了Python 3.10。

几点注意事项:

  • 如果在安装过程中遇到任何错误,请确保你已经安装了所有必要的依赖。
  • 使用pyenv安装的Python版本不会影响系统自带的Python版本。
  • 你可以使用pyenv versions命令查看所有已安装的Python版本。

如果在执行这些步骤时遇到任何问题,请告诉我具体的错误信息,我会很乐意帮你解决。



这样就都是3.10.0了~


在部署chenjun的python服务过程中,遇到了两个问题:

  1. 通过pyenv安装了python 3.10, 也把相应配置加到了.bashrc最后面:
1
2
3
4
5
6
7
# pyenv 配置
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
fi

source .bashrc 后是3.10

但是新开一个窗口,就还是2.7.17

这是因为 还有个 .profile

把上面这段也加到.profile最后…因为.profile有个export的操作…

1
2
3
4
5
6
7
8
9
10
11
# ~/.profile: executed by Bourne-compatible login shells.

if [ "$BASH" ]; then
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
fi

mesg n || true
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin:/usr/local/go/bin:/home/ubuntu/.vector/bin"
. "$HOME/.cargo/env"

我理解您的沮丧。让我们更深入地排查这个问题。看来更改没有按预期生效。我们需要确保我们的配置正确加载并优先于系统默认设置。让’s尝试以下步骤:

  1. 首先,让我们检查 .bashrc 文件是否真的被加载。在 Ubuntu 中,有时候 .profile 文件会覆盖 .bashrc 的设置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 文件:~/.bashrc
# 在文件末尾添加:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
pyenv global 3.10.0

# 文件:~/.profile
# 在文件末尾添加:

# 如果存在 .bashrc,则加载它
if [ -n "$BASH_VERSION" ]; then
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi

# 确保 pyenv 路径被添加
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"

# 文件:~/.bash_profile(如果不存在则创建)
# 文件内容:

# 加载 .profile
if [ -f "$HOME/.profile" ]; then
. "$HOME/.profile"
fi

# 加载 .bashrc
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi

现在,让我们按照以下步骤操作:

  1. 编辑 .bashrc 文件:

    1
    nano ~/.bashrc

    添加 artifact 中 .bashrc 部分的内容到文件末尾。

  2. 编辑 .profile 文件:

    1
    nano ~/.profile

    添加 artifact 中 .profile 部分的内容到文件末尾。

  3. 创建或编辑 .bash_profile 文件:

    1
    nano ~/.bash_profile

    添加 artifact 中 .bash_profile 部分的内容。

  4. 确保 pyenv 已正确安装。如果没有,请安装:

    1
    curl https://pyenv.run | bash
  5. 安装 Python 3.10.0(如果还没有安装):

    1
    pyenv install 3.10.0
  6. 设置全局 Python 版本:

    1
    pyenv global 3.10.0
  7. 重新加载配置:

    1
    2
    3
    source ~/.bashrc
    source ~/.profile
    source ~/.bash_profile
  8. 完全关闭终端,然后重新打开一个新的终端窗口。

  9. 检查 Python 版本:

    1
    python --version

如果按照这些步骤操作后,Python 版本仍然显示为 2.7.17,请尝试以下额外的排查步骤:

  1. 检查 PATH 变量:

    1
    echo $PATH

    确保 ~/.pyenv/shims~/.pyenv/versions/3.10.0/bin 在 PATH 的最前面。

  2. 检查 pyenv 是否正确设置:

    1
    pyenv version

    应该显示 3.10.0。

  3. 检查系统级的 Python 设置:

    1
    which python

    这应该指向 pyenv 管理的 Python 版本。

如果经过这些步骤,问题仍然存在,可能需要检查是否有其他系统级别的设置覆盖了这些配置。在这种情况下,请告诉我,我们可以进一步调查系统级别的配置文件。



  1. 遇到的第二个问题上, 经过上面的操作, 新开窗口也已经是python 3.10了.d

但因为部署过程中有用到ansible,还一直是2.7.17

根据下面的询问,最后发现改成这样就行了:

1
devshare ansible_user=ubuntu ansible_port=22 ansible_host=172.22.0.137 ansible_ssh_private_key_file=/data/ansible/ansiblefordev ansible_python_interpreter=/home/ubuntu/.pyenv/shims/python

感谢您的反馈。我理解您在使用Ansible时遇到的问题。这个问题出现是因为Ansible默认使用系统的Python解释器,而不是您在本地环境中设置的Python版本。让我们来解决这个问题。

1
2
3
4
5
6
7
8
9
[defaults]
interpreter_python = /usr/bin/python3

[inventory]
enable_plugins = host_list, script, auto, yaml, ini, toml

[ssh_connection]
pipelining = True

要解决这个问题,我们需要配置Ansible使用Python 3。以下是具体步骤:

  1. 首先,确保目标机器(在这里是 ‘devshare’)上安装了Python 3。通常,Ubuntu 18.04已经预装了Python 3。

  2. 创建或编辑Ansible配置文件。如果还没有配置文件,创建一个:

    1
    nano ~/ansible.cfg

    或者如果您想要全局配置:

    1
    sudo nano /etc/ansible/ansible.cfg
  3. 在配置文件中添加上面artifact中的内容。这将强制Ansible使用Python 3。

  4. 保存并关闭文件。

  5. 现在,当您运行Ansible命令时,添加 -e 'ansible_python_interpreter=/usr/bin/python3' 参数来指定Python 3解释器。例如:

    1
    ansible -i /data/ansible/inventory/devshare.ini devshare -m command -a "python3 --version" -e 'ansible_python_interpreter=/usr/bin/python3'
  6. 如果您不想每次都添加这个参数,可以在您的inventory文件(/data/ansible/inventory/devshare.ini)中为特定主机或组设置Python解释器。添加如下行:

    1
    devshare ansible_python_interpreter=/usr/bin/python3
  7. 如果您想在playbook中设置,可以添加如下变量:

    1
    2
    vars:
    ansible_python_interpreter: /usr/bin/python3
  8. 对于ad-hoc命令,您也可以使用 python3 替代 python

    1
    ansible -i /data/ansible/inventory/devshare.ini devshare -m command -a "python3 --version"

这些更改应该解决Ansible使用Python 2.7的问题。请尝试这些方法,看看是否解决了您的问题。如果您仍然遇到困难,请告诉我具体的错误信息或输出,我会很乐意提供进一步的帮助。



我理解您想要为 devshare 主机指定特定的 Python 解释器路径。我们可以轻松地将这个设置添加到您的 inventory 文件中。让我们修改您的 inventory 文件来包含这个新的设置。

1
2
3
4
5
[dev_group]
devshare ansible_user=ubuntu ansible_port=22 ansible_host=172.22.0.137 ansible_ssh_private_key_file=/data/ansible/ansiblefordev ansible_python_interpreter=/home/ubuntu/.pyenv/shims/python
taskonoperation ansible_user=ubuntu ansible_port=22 ansible_host=172.22.0.63 ansible_ssh_private_key_file=/data/ansible/ansiblefordev
saas ansible_user=ubuntu ansible_port=22 ansible_host=172.22.0.109 ansible_ssh_private_key_file=/data/ansible/ansiblefordev

要添加 ansible_python_interpreter 设置,您只需要在 devshare 主机的行末尾添加这个配置。以下是具体步骤:

  1. 打开您的 inventory 文件进行编辑。假设文件位置是 /data/ansible/inventory/devshare.ini

    1
    nano /data/ansible/inventory/devshare.ini
  2. 找到 devshare 的配置行,并在行末添加 ansible_python_interpreter 设置。修改后的行应该如上面 artifact 中所示。

  3. 保存并关闭文件。

这个更改将告诉 Ansible 在连接到 devshare 主机时使用指定的 Python 解释器(在这里是 /home/ubuntu/.pyenv/shims/python)。

现在,当您运行针对 devshare 的 Ansible 命令时,它将使用您指定的 Python 解释器。例如:

1
ansible -i /data/ansible/inventory/devshare.ini devshare -m command -a "python --version"

这个命令现在应该返回您期望的 Python 版本。

请注意,这个设置只会影响 devshare 主机。如果您想为所有主机设置相同的 Python 解释器,您可以在 inventory 文件的 [dev_group:vars] 部分添加这个设置,或者在 Ansible 配置文件中全局设置。

如果您在应用这个更改后遇到任何问题,或者需要为其他主机进行类似的配置,请随时告诉我。我很乐意提供进一步的帮助。


2024.12.05
Mac 上面

python3.10 -m venv myenv
source myenv/bin/activate








20250727

从pip到uv:一口气梳理现代Python项目管理全流程!

让uv管理Python的一切



  • uv python list — 列出uv支持的python版本
  • uv python install cpython3.12 — 安装某个python版本 (3.12)
  • uv run -p 3.12 xxx.py — 使用特定版本python运行xxx.py
  • uv run -p 3.12 python — 运行python交互界面
  • uv run xxx.py — 使用系统python或当前工程的虚拟环境运行xxx.py
  • uv init — 创建工程
  • uv add pydantic_ai — 添加依赖 (pydantic_ai)
  • uv tree — 打印依赖树
  • uv remove pydantic_ai — 删除依赖
  • uv build — 编译工程

sample code: https://gist.github.com/cradiator/b486a3148be3ab63ae7d0c5376fcf783

还有类似的“锈化”库:

ruff(替代 flake8 + black + isort):超快的 Python 代码检查和格式化工具,比 flake8 快 50 倍。

polars(替代 pandas):高性能 DataFrame 计算库,采用 无 GIL、多线程优化,比 pandas 处理大数据快得多。

maturin(替代 setuptools):Rust 编写 Python 扩展的工具,构建速度更快,依赖管理更轻量。

pyo3(替代 Cython):让 Rust 可以直接编写 Python 扩展,比 Cython 更安全、更快。

pyoxidizer(替代 pyinstaller):将 Python 打包成二进制的工具,生成的文件 更小更快,适合分发。

uv(替代 pip):更快的 Python 依赖管理工具,Rust 并行解析,比 pip 快 10 倍


uv比anaconda快很多,但是总体来说,它们不是同一类型的。anaconda能使用conda生态系统,并且自带很多软件比如spyder、jupyter,这些uv都没有。conda生态系统中也有类似uv的新产品pixi,不过pixi目前还缺了一些功能anaconda有它的独特性,但是使用miniconda、micromamba、piix等等,是可以替代anaconda的(就是少了自带的一堆东西),需要conda生态系统的研究者可以使用这些代替anaconda(当然也可以用anaconda,就是anaconda我感觉有点太大了)。一般的开发者,不太适合使用anaconda,对他们来说,有poetry等工具可以使用,而uv是其中最先进的工具。