Mac和Linux终端中运行Python脚本的命令与权限设置

南乔
南乔
发布时间:2026-11-03| 8人浏览过
原创

详细讲解在Mac与Linux终端中运行Python脚本的两种核心方式(解释器调用与直接可执行运行)、文件权限体系与chmod命令配置、Shebang工作原理及常见报错排查。

适用环境:macOS (Terminal / iTerm2) / Linux (Ubuntu, Debian, CentOS 等) 技术核心:Python3 运行时 · chmod 权限 · Shebang 规范 实用教程
在 Mac 与各类 Linux 发行版等类 Unix 系统中,终端是开发、部署和自动化调度 Python 脚本的标准工作环境。运行 Python 脚本主要存在两种核心路径:一种是通过终端直接调用解释器命令(如 python3 script.py),此时文件仅需基础的读取权限;另一种是将脚本包装为可直接独立执行的命令(如 ./script.py),此时必须在文件首行声明 Shebang 解释器定位符,并显式为文件赋予执行权限(chmod +x 或 chmod 755)。本文围绕这两种运行方式的操作步骤、系统层面的权限机制、Shebang 的跨平台解析原理以及高频故障排查进行系统梳理。
Mac和Linux终端中运行Python脚本的命令与权限设置
图 0:Mac 与 Linux 终端运行 Python 脚本的两种核心路径与底层依赖概览

一、检查终端 Python 环境与命令规范

在进入具体执行操作前,必须首先明确当前终端调用的 Python 解释器版本与安装路径。现代 macOS(自 macOS 12.3 彻底移除自带 Python 2.7)以及主流 Linux 发行版(如 Ubuntu 20.04+)均已全面以 Python 3 为核心基准。

1. 确认解释器可用性与版本

在终端中键入以下命令,检查系统当前默认可用的 Python 3 二进制文件:

Terminal
$ python3 --version
示例输出:Python 3.11.8 $ which python3
示例输出(macOS Homebrew):/opt/homebrew/bin/python3
示例输出(Linux apt):/usr/bin/python3
重要注意事项:避免在命令中直接输入 python

在大部分现代 Mac 与 Linux 系统中,直接键入 python 会返回 command not found: python 错误。这是因为官方与各大发行版为了防止旧版 Python 2 与 Python 3 混淆,不再默认创建指向 python3 的 python 软链接。因此,在终端执行时应始终使用明确的 python3 命令。

二、方式一:通过解释器命令显式运行脚本

这是最基础、最直观的运行方式。用户在终端中明确指明解释器程序,并将脚本文件的路径作为第一个参数传递给解释器。

1. 基本执行语法与相对/绝对路径

假设在当前工作目录下存在一个名为 app.py 的脚本,内容为简单的打印与逻辑处理:

# app.py 示例内容
print("脚本在终端中成功执行")

在当前目录下运行时,直接输入:

bash / zsh
$ python3 app.py
示例输出:脚本在终端中成功执行

若脚本位于其他目录,可指定相对路径或绝对路径执行:

# 使用相对路径执行子目录中的脚本
python3 ./scripts/backup.py

# 使用绝对路径执行位于用户主目录的脚本
python3 /Users/username/projects/data_process.py   # macOS 绝对路径
python3 /home/username/projects/data_process.py   # Linux 绝对路径

2. 传递命令行参数

在实际工程中,脚本往往需要接收外部动态参数。Python 内部可通过 sys.argv 或标准库 argparse 捕获。在命令后跟随的任意空格分隔字符串均会被原样传递:

Terminal
$ python3 migrate.py --env production --batch-size 500
示例输出:[INFO] 正在以 production 环境批量处理 500 条数据...

3. 后台运行与保持任务不中断

当执行长时间运行的数据处理或自动化爬虫时,若希望命令在后台运行且在关闭终端窗口后不被杀死,可配合 Unix 的 nohup 与 & 管道符:

Terminal
$ nohup python3 -u worker.py > worker.log 2>&1 &
示例输出:[1] 48291

其中 -u 禁用标准输出缓冲区以实时写入日志,> worker.log 2>&1 将标准输出与标准错误全部重定向至日志文件,最后的 & 将进程置于后台执行,终端会立即返回该任务的进程号(PID)。

Mac和Linux终端中运行Python脚本的命令与权限设置
图 1:解释器显式调用与 Shebang 直接执行在系统底层的调用链路流转对比

三、方式二:将脚本设为可执行文件直接运行(./script.py)

在编写 CLI 命令行工具、Git Hook 钩子、或者由 Cron 定时任务调度的自动化脚本时,我们更倾向于像执行系统原生二进制程序一样直接键入 ./script.py。这种直接运行方式必须同时满足两个核心前提:

  1. 首行指定 Shebang 指令:告知操作系统使用何种解释程序来解析后续代码;
  2. 赋予可执行权限位:在文件系统元数据中开启允许被执行的 x 权限。

1. 第一步:添加正确的 Shebang 指令

Shebang(也称为 Hashbang)是位于纯文本脚本文件第一行、以 #! 开头的特殊注释标识。当内核尝试直接执行该文件时,一旦读取到 #!,便会识别出其后的路径作为启动解释器。

标准规范写法如下,必须严格置于文件的第 1 行第 1 个字符:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys

def main():
    print(f"独立程序执行成功,当前解释器路径为:{sys.executable}")

if __name__ == "__main__":
    main()

2. 第二步:设置文件执行权限(chmod +x)

在 Mac 与 Linux 操作系统中,新建的文件默认权限通常是 -rw-r--r--(只具备读写权限,无执行权限)。如果直接运行未赋予执行权限的脚本,终端会明确报错:

Terminal
$ ./app.py
zsh: permission denied: ./app.py (macOS 默认)
bash: ./app.py: Permission denied (Linux 默认)

此时需要使用 chmod(Change Mode)命令赋予执行权限:

Terminal
$ chmod +x app.py
$ ./app.py
示例输出:独立程序执行成功,当前解释器路径为:/opt/homebrew/bin/python3
为什么必须加 ./ 前缀?

在 Windows 的命令提示符中,系统默认会在当前目录中搜索程序。但出于操作系统安全考量(防止恶意木马伪造同名常用命令如 ls 或 cd 并诱导执行),Unix 系统的环境变量 $PATH 默认不包含当前目录 .。因此,在终端执行当前目录下的程序时,必须显式以 ./(当前目录)引导路径。

Mac和Linux终端中运行Python脚本的命令与权限设置
图 2:Shebang 解释器解析机制:为什么推荐使用 /usr/bin/env 动态查找

四、深入理解 Shebang:为什么推荐 #!/usr/bin/env python3

不少读者在参考某些旧教材时会见到 #!/usr/bin/python3 这种硬编码路径写法。在现代跨平台工程中,强烈建议统一使用 #!/usr/bin/env python3,二者背后的工作机制有着根本性的差别:

1. 硬编码路径的局限与崩溃风险

若将脚本写为 #!/usr/bin/python3,操作系统内核会严格要求在根目录下的 /usr/bin/ 目录中必须存在名为 python3 的二进制文件。但在真实开发环境中:

  • macOS (Apple Silicon M1/M2/M3):通过 Homebrew 安装的 Python 位于 /opt/homebrew/bin/python3;
  • macOS (Intel 芯片):Homebrew 安装路径为 /usr/local/bin/python3;
  • 虚拟环境隔离:项目若激活了基于 venv 或 conda 的隔离环境,Python 位于虚拟环境的 bin 目录下,而硬编码的系统路径会强行绕过虚拟环境,导致所有安装在虚拟环境里的第三方库全部报 ModuleNotFoundError;
  • 精简 Linux 发行版:在轻量 Alpine 或定制容器镜像中,Python 可能安装在 /usr/local/bin/,此时直接执行就会弹出 bad interpreter: No such file or directory。

2. env 工具的动态解析机制

在所有类 Unix 系统中,/usr/bin/env 是遵循 POSIX 规范的统一工具。它的功能是在当前 Shell 的环境变量 $PATH 所列出的一系列路径中依次搜寻后面的可执行文件。

采用 #!/usr/bin/env python3 后:

  • 若未激活虚拟环境,系统自动定位全局 $PATH 中优先级最高、正常可用的 python3;
  • 若通过 source .venv/bin/activate 激活了虚拟环境,虚拟环境的 bin 目录会自动被前置追加到当前 Shell 的 $PATH 最前端,此时该 Shebang 会准确、透明地使用当前虚拟环境中的 Python,无需对脚本做任何代码改动。
Mac和Linux终端中运行Python脚本的命令与权限设置
图 3:Unix 权限位结构分解、加权数值模型与常用 chmod 命令对照

五、Mac 与 Linux 权限体系与 chmod 设置详解

要彻底避免 Permission denied 报错,必须深入理解 Unix 系统下的文件权限机制。通过在终端中输入 ls -l app.py,可以查看到文件的权限属性字符串。

1. 权限字符结构剖析

典型的文件权限输出形式如 -rwxr-xr-x,从左至右由 10 个字符组成:

  • 第 1 位(文件类型):- 代表普通文件,d 代表目录,l 代表软链接;
  • 第 2~4 位(所有者 User 权限):定义创建或拥有该文件的用户的读(r)、写(w)、执行(x)能力;
  • 第 5~7 位(所属组 Group 权限):定义与该文件同组用户所享有的权限;
  • 第 8~10 位(其他人 Others 权限):定义系统中任何其他非同组访客的权限。

2. 八进制数字权限计算原理

在 Linux 和 Mac 系统中,每一个字符位在底层对应一个布尔二进制位,八进制表示法通过简单的权重求和表示:

权限类型 符号表示 数值权重 对 Python 脚本的实际意义
读取(Read) r 4 允许打开并读取脚本文件源码。无论是 python3 app.py 还是 ./app.py,都必须具有此权限。
写入(Write) w 2 允许编辑、修改、保存或清空脚本内容。纯运行脚本时并不需要写权限。
执行(Execute) x 1 允许操作系统内核将该文件作为可运行程序启动。仅对 ./app.py 形式必须。

每一组的最高权值为 4 + 2 + 1 = 7(rwx)。因此常见的权限组合为:

  • 755(-rwxr-xr-x):标准可执行脚本权限。所有者具备读写执行(7),组用户和其他人具备读与执行(5)。这是最通用、推荐的生产脚本权限。
  • 644(-rw-r--r--):标准数据文件权限。所有者读写(6),组与其他人只读(4)。无法通过 ./app.py 运行,但可以通过 python3 app.py 运行。
  • 700(-rwx------):高私密性脚本权限。仅文件拥有者自己可以读、写、执行,同组其他人完全无法访问。适合包含敏感 API Key、数据库备份或自动化运维密码的脚本。

3. 常用 chmod 操作命令对照

# 方案一:符号模式(直观加减)
chmod +x app.py        # 为所有者、组、其他人统一附加执行权限
chmod u+x app.py       # 仅为文件所有者(User)附加执行权限
chmod -x app.py        # 移除文件的执行权限

# 方案二:数字模式(严谨确定)
chmod 755 app.py       # 设定为所有者全权,其他人可读可执行(最常用)
chmod 700 app.py       # 仅所有者可执行,其他人无权访问

六、虚拟环境与计划任务调度规范

在实际项目部署中,开发人员常遇到“在终端里测试好好的,放进 Crontab 或后台服务中就报错”的情况。这通常是因为非交互式环境缺失正确的环境变量与虚拟环境指向。

1. 在虚拟环境中执行脚本

当使用 python3 -m venv .venv 创建了虚拟隔离环境后,推荐两种标准执行方式:

Terminal
# 方式 A:先激活环境,再执行(适合交互式日常调试)
$ source .venv/bin/activate
(.venv) $ python3 app.py # 或 ./app.py

# 方式 B:直接用虚拟环境内的解释器绝对路径执行(最稳妥,免去激活步骤)
$ /Users/dev/my_project/.venv/bin/python app.py

2. 定时任务(Crontab)中的运行规范

Linux 与 macOS 的 cron 守护进程在执行任务时,其内建的 $PATH 往往极度精简(通常仅包含 /usr/bin:/bin),不会加载 ~/.bashrc 或 ~/.zshrc 中的个性化配置。

因此在 crontab -e 中配置调度任务时,一律使用绝对路径,示例:

# 每天凌晨 2 点执行数据同步脚本,全部使用绝对路径定位解释器与脚本
0 2 * * * /home/deploy/project/.venv/bin/python /home/deploy/project/sync.py >> /var/log/sync.log 2>&1
Mac和Linux终端中运行Python脚本的命令与权限设置
图 4:Mac 与 Linux 终端运行 Python 脚本高频报错排查与解决决策树

七、常见报错与故障诊断指南

1. 报错:Permission denied

典型表现:终端提示 zsh: permission denied: ./app.py。

排查与修复:

  1. 使用 ls -l app.py 查看权限。如果输出类似 -rw-r--r--,说明完全没有可执行权限位;
  2. 运行 chmod +x app.py 或 chmod 755 app.py 赋予执行位;
  3. 若赋予权限后依然报错,检查文件所属用户(Owner)。若文件为 root 所有而当前为普通用户,可运行 sudo chown $USER app.py 将文件所有权收归当前用户。

2. 报错:bad interpreter: No such file or directory 或 ^M 乱码

典型表现:直接执行 ./app.py 时,系统提示 /usr/bin/env: 'python3 ': No such file or directory。

原因解释:该脚本文件曾在 Windows 系统中使用文本编辑器(如未配置换行符的记事本等)保存过。Windows 的换行符采用 CRLF( ),而 Mac 和 Linux 采用 LF( )。内核在解析首行 Shebang 时,将不可见的 (回车符)当成了程序名称的一部分,导致系统去寻找一个名为 python3 的不存在的程序。

快速解决方式:在终端中使用 tr 命令或 dos2unix 工具过滤回车符:

Terminal
# 使用系统内置 tr 命令清理并覆盖原文件
$ tr -d ' ' < app.py > app_clean.py && mv app_clean.py app.py
$ chmod +x app.py
再次执行 ./app.py 即可正常通过

3. 报错:command not found: python

排查与修复:在 macOS 和绝大多数现代 Linux 中,默认只提供 python3。优先将所有命令统一修改为 python3。若因历史脚本习惯希望键入 python,可在当前 Shell 配置文件(macOS 默认为 ~/.zshrc,Linux 默认为 ~/.bashrc)中追加一行别名设置:

# 打开配置文件追加 alias
echo "alias python=python3" >> ~/.zshrc    # macOS
echo "alias python=python3" >> ~/.bashrc   # Ubuntu / Linux

# 重新加载配置使其立即生效
source ~/.zshrc   # 或 source ~/.bashrc

八、日常操作核心规范速查

  • 临时运行与快速调试:优先使用 python3 script.py,对文件仅需读取权限(644),不需要配置 Shebang,简便直接;
  • 工程化脚本与系统命令:在脚本首行添加 #!/usr/bin/env python3,并通过 chmod +x script.py 赋予可执行位,以便通过 ./script.py 独立启动;
  • 注意当前目录安全限制:在当前目录下直接运行可执行脚本时,始终携带 ./ 前缀;
  • 虚拟环境配合:使用 #!/usr/bin/env python3 可在激活虚拟环境时自动借用虚拟解释器,或者在后台调度中使用虚拟环境的完整绝对路径进行触发;
  • 跨系统传输警惕换行符:从 Windows 复制或拉取脚本到 Mac/Linux 后,若报 bad interpreter,首先检查并转换为 Unix LF 换行符。
本文覆盖 macOS 与 Linux 终端运行 Python 脚本的完整执行机制、权限规范与诊断手段。遵循统一的标准规范,能够有效提升脚本在不同类 Unix 系统与自动化运维流程中的稳定性和可移植性。
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。