Linux下怎么指定Python3版本运行脚本

不晚
不晚
发布时间:2026-10-22 | 3人浏览过
原创

在多版本 Python 并存的 Linux 环境中,指定特定 Python 3 版本运行脚本主要有四种明确途径:最直接的方法是在命令行显式调用目标解释器(如 python3.10 script.py 或绝对路径 /usr/bin/python3.10 script.py);最规范的脚本交付方式是在文件首行配置 Shebang 声明(如 #!/usr/bin/env python3.10)并赋予可执行权限后直接运行;最稳健的工程实践是使用目标版本创建专属虚拟环境(venv),通过环境隔离确保解释器与三方依赖强绑定;若需调整系统全局或特定目录的默认行为,则可借助 update-alternatives 或 pyenv 工具进行路由分发。根据实际场景(单次排查、自动化定时任务或团队工程交付)选择适宜的调用模式,即可精准锁定执行环境,杜绝因语法不兼容或依赖缺失导致的运行时报错。

一、排查系统中已安装的 Python 3 版本

在指定版本执行之前,首先需要明确当前系统究竟安装了哪些 Python 3 版本,以及它们各自对应的可执行文件物理路径。不同的 Linux 发行版(如 Ubuntu、Debian、CentOS、Rocky Linux)默认安装目录可能存在差异,通常位于 /usr/bin、/usr/local/bin 或用户家目录下的特定管理路径中。

可以通过以下命令检索系统中所有可用的 Python 3 二进制程序:

# 查看当前 PATH 中所有名为 python3 的执行路径
which -a python3

# 列出 /usr/bin 目录下所有的 python3 相关版本二进制
ls -l /usr/bin/python3*

# 检查特定可执行程序的具体版本号(示例)
/usr/bin/python3.8 --version
/usr/bin/python3.10 --version
提示:终端中的 python3 通常只是一个软链接(Symbolic Link),指向具体的默认版本(如 /usr/bin/python3.8)。因此,仅执行 python3 --version 只能看到当前默认版本,不能代表系统可用的所有版本。

二、方法一:在命令行显式调用目标解释器

显式调用是最直接、理解门槛最低的方式。无需修改脚本源代码,也无需调整系统全局配置,只需在命令行前端明确指定目标 Python 二进制文件的名称或完整路径,后接需要执行的脚本文件即可。

1. 直接通过带版本后缀的命令调用

大多数主流发行版在通过包管理器安装多版本 Python 后,都会自动在 /usr/bin 下注册带有次版本号的可执行文件名:

# 显式指定使用 Python 3.10 执行脚本
python3.10 app.py

# 显式指定使用 Python 3.12 执行脚本
python3.12 app.py

2. 使用绝对路径调用

如果你自行编译安装了 Python(例如通过源码编译至 /usr/local/bin/python3.11),或者该路径未加入全局 $PATH 环境变量中,直接提供完整绝对路径是最具确定性的方式:

/usr/local/bin/python3.11 app.py

适用场景:单次功能验证、跨版本语法兼容性排查、一次性运维脚本执行。缺点在于强依赖用户手动输入,无法作为标准化工具分发给第三方。

Linux下怎么指定Python3版本运行脚本
图 1:Linux 下指定 Python 3 版本的四种主流途径与执行模型

三、方法二:利用脚本首行 Shebang 机制指定版本

如果希望将 Python 脚本像 Linux 原生二进制程序或 Shell 脚本一样直接执行(例如 ./my_script.py),最佳做法是在脚本的第一行添加 Shebang(也称 Hashbang)指令。

1. 常见的两种 Shebang 声明格式

  • 推荐写法(动态环境寻址):#!/usr/bin/env python3.10
    该写法利用 Linux 系统自带的 /usr/bin/env 工具,在执行时从当前用户的 $PATH 变量中自适应查找第一个匹配的 python3.10 可执行文件。具有良好的跨机器可移植性。
  • 绝对路径写法(硬编码):#!/usr/bin/python3.10
    强行指定调用 /usr/bin/python3.10。若目标服务器的 Python 3.10 实际安装在 /usr/local/bin 或用户家目录下,该脚本将直接报错终止。

2. 完整操作步骤示例

编辑脚本文件 task.py,在第一行写入 Shebang 并编写测试逻辑:

#!/usr/bin/env python3.10
import sys

print(f"当前执行脚本的 Python 解释器路径: {sys.executable}")
print(f"当前 Python 版本详情: {sys.version}")

保存文件后,在 Linux 终端中为该脚本增加可执行权限,并直接运行:

# 为当前文件添加可执行权限
chmod +x task.py

# 直接运行脚本
./task.py
Linux下怎么指定Python3版本运行脚本
图 2:Shebang 原理与两类路径解析流程对比
避坑提醒:Windows 换行符(CRLF)导致的致命报错
如果在 Windows 编辑了脚本再上传到 Linux 执行,可能会遇到报错:/usr/bin/env: 'python3.10\r': No such file or directory。
这是因为 Windows 使用 \r\n 换行,Linux 内核会把 \r 当作文件名的一部分去寻找。可通过 dos2unix task.py 或 sed -i 's/\r$//' task.py 快速消除回车符。

四、方法三:使用目标版本创建专属虚拟环境(工程与生产首选)

在企业级开发与生产部署中,现代 Linux 发行版(如 Ubuntu 23.04+、Debian 12+)全面实施了 PEP 668 规范,直接通过 pip 向系统 Python 目录安装依赖会被系统直接拦截(报错 externally-managed-environment)。此时,基于特定 Python 3 版本创建独立的虚拟环境(venv) 是业界公认最健壮的做法。

1. 用指定 Python 版本初始化虚拟环境

调用对应版本的 -m venv 命令创建环境目录:

# 使用 Python 3.10 创建名为 venv_310 的隔离环境
python3.10 -m venv /opt/venvs/venv_310

# 使用 Python 3.12 创建名为 venv_312 的隔离环境
python3.12 -m venv /opt/venvs/venv_312

2. 执行脚本的两种方式

  • 交互式调试:激活后运行
    在终端中执行 source /opt/venvs/venv_310/bin/activate,此时当前 Shell 的 $PATH 变量头部会自动注入该虚拟环境的 bin 目录。随后运行 python script.py,实际执行的就是环境内绑定的 Python 3.10。
  • 自动化任务:免激活直接调用(推荐)
    在编写 Linux crontab 定时任务、systemd 守护进程或自动化 Shell 调度脚本时,强烈建议不进行 activate,而是直接指定虚拟环境内的 Python 可执行程序路径:
    /opt/venvs/venv_310/bin/python /data/projects/app.py
    虚拟环境内的 bin/python 内部包含指向对应主版本的软链接以及隔离的 pyvenv.cfg 配置文件,无需加载外部激活脚本,即可确保独立运行环境。
Linux下怎么指定Python3版本运行脚本
图 3:虚拟环境隔离与特定 Python 3 版本绑定架构

五、方法四:基于系统软链接或环境管理工具切换

当日常开发涉及多个工程、需要经常在终端内以 python3 简写调用不同版本时,可以借助系统级或用户态的多版本管理工具。

1. Debian / Ubuntu 的 update-alternatives 方案

系统管理员可以将多个已安装的 Python 注册到 update-alternatives 中,建立集中管理的符号链接集群:

# 注册 python3.8 为候选版本(优先级 1)
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1

# 注册 python3.10 为候选版本(优先级 2)
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 2

# 交互式切换当前系统全局默认的 python3 指向
sudo update-alternatives --config python3
高危警告:在 Ubuntu 等操作系统中,/usr/bin/python3 深度绑定了系统的包管理器(如 apt、software-properties-common 等核心组件)。若将其全局默认版本强行切换至不兼容的高版本,可能导致系统级软件管理指令崩溃。此方法更推荐在仅开发测试用途的隔离机器上使用。

2. 用户态工具 pyenv(推荐开发者本地环境使用)

pyenv 不修改系统全局软链接,而是在用户家目录下的 ~/.pyenv/shims 注入拦截层(Shim)。它可以根据当前终端所在的目录自动切换版本:

# 在项目目录中指定局部生效的 Python 版本(生成 .python-version 文件)
cd /data/projects/my_project
pyenv local 3.10.13

# 此时直接运行 python 或 python3,会自动路由到 3.10.13
python script.py

六、常见运行故障排查与避坑要点

即使正确配置了脚本或环境,在实际执行过程中仍常因 Linux 机制的细节导致实际运行版本与预期不符。以下是三个最常见的问题与诊断方法:

1. 脚本写了 Shebang,但执行时依然运行了错误的版本

原因排查:检查执行命令是否使用了 python3 script.py。如果你在命令行显式写了 python3,Linux 内核会直接运行该 python3 命令并将 script.py 作为参数传入,此时脚本第一行的 Shebang 将被直接当作普通注释忽略。
正确做法:必须赋予脚本执行权限后,使用 ./script.py 直接运行,Shebang 才会生效。

2. 提示 "/usr/bin/env: 'python3.10': No such file or directory"

原因排查:说明当前环境的 $PATH 变量中找不到名为 python3.10 的可执行文件。可能该版本安装在非标准目录(如 /usr/local/python310/bin)。
解决方法:检查实际安装位置,并在 /usr/local/bin 下创建指向真实二进制文件的软链接:
sudo ln -s /usr/local/python310/bin/python3.10 /usr/local/bin/python3.10

3. 解释器版本正确,但导入三方模块抛出 ModuleNotFoundError

原因排查:每个 Python 版本都拥有完全独立的 site-packages 目录。使用 pip install package 安装的包可能默认装入了系统 Python 3.8 的目录,而通过 python3.10 script.py 运行时无法查找到该包。
解决方法:安装第三方包时务必对应解释器调用 pip,例如:python3.10 -m pip install <package_name>,或直接在对应的 venv 虚拟环境中进行安装。

七、方案选择与最佳实践总结

综合以上各方案的特性与工程代价,下表展示了不同运行场景下的最优推荐:

应用场景 推荐方案 执行形式 核心优势
临时排错 / 单次对比 命令行显式调用 python3.10 script.py 零配置、响应快,立即可验证版本兼容性
CLI 工具 / 独立脚本分发 Shebang 动态声明 ./script.py 对外部调用者透明,封装度高,跨机器自适应
生产部署 / 定时任务 (Cron) 指定版本 venv 免激活 /opt/venv/bin/python script.py 依赖与解释器强绑定,零环境污染,确定性极高
开发机多工程日常联调 用户态 pyenv 管理 pyenv local 3.10.x 无缝目录级自动切换,安全不破坏系统底层环境
Linux下怎么指定Python3版本运行脚本
图 4:Linux 下指定 Python 3 运行版本选型与综合总结图

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表