macOS和Linux下通过终端执行Python脚本的路径写法

阿澈
阿澈
发布时间:2026-10-20 | 3人浏览过
原创
在 macOS 和 Linux 终端中运行 Python 脚本,核心是向解释器(如 python3)提供脚本在统一树状文件系统中的定位地址。掌握绝对路径、相对路径、家目录符号 ~ 的解析规则,以及应对包含空格与特殊字符的转义技巧,能够确保脚本在交互式终端、自动化脚本及定时任务中稳定执行。

一、UNIX 路径体系与核心执行机制

macOS 与各大 Linux 发行版均遵循基于 UNIX 的层级文件系统规范。与 Windows 拥有 C:、D: 等驱动器盘符不同,macOS 和 Linux 仅存在一个统一的根目录 /,系统中的所有硬盘分区、外接移动设备和虚拟文件系统均挂载在根目录下的不同子树中。

在终端中执行 Python 脚本,通常有两种基本模式:

  1. 显式调用解释器并传入路径:例如 python3 [路径/脚本名.py]。这种方式下,终端只需拥有对该 .py 文件的读权限。
  2. 将脚本作为可执行程序直接运行:例如 ./[脚本名.py] 或 /[绝对路径/脚本名.py]。这种模式要求脚本首行声明 Shebang 指令,且文件必须具备执行权限(+x)。

无论选择哪种方式,准确向系统告知脚本文件的存放位置都是第一步。系统识别路径的方式分为两大类:绝对路径与相对路径。

macOS和Linux下通过终端执行Python脚本的路径写法
图 1:macOS 与 Linux 文件系统结构树及绝对路径映射关系

二、绝对路径写法:从根目录出发的确定性定位

绝对路径以正斜杠 / 开头,代表从整个文件系统的最顶层根节点开始向下逐级寻址,一直到达具体的目标脚本。无论终端当前所处的工作目录在哪里,绝对路径所指向的文件都是唯一且不可混淆的。

1. 系统层级与常见绝对路径

在不同操作系统中,用户主目录的根基路径有所区别:

  • macOS:普通用户的主目录统一存放在 /Users/ 目录下。若当前登录用户名为 alex,则桌面路径为 /Users/alex/Desktop/,执行该目录下的脚本命令为:
终端命令示例
python3 /Users/alex/Desktop/analysis.py
  • Linux:普通用户的主目录通常位于 /home/ 目录下。若用户名为 alex,脚本位于工程目录中,完整执行命令为:
终端命令示例
python3 /home/alex/projects/crawler/main.py

2. 家目录快捷符号 ~ 的工作原理与陷阱

在交互式终端(如 Zsh 或 Bash)中,波浪号 ~ 是指向当前用户主目录的内置缩写。例如,在 macOS 上 ~/projects/app.py 与 /Users/alex/projects/app.py 在执行效果上完全等同。

但必须注意 Shell 展开规则:

  • 未加引号或双引号外的 ~:Shell 会在把命令传给 Python 前将其展开为绝对路径。
    python3 ~/data_clean.py
  • 包含在双引号或单引号内部的 ~:Shell 不会对引号内的波浪号进行波浪号展开(Tilde Expansion)。如果写成 python3 "~/data_clean.py",Python 解释器收到的真实参数字面量就是 ~/data_clean.py,导致系统报错 No such file or directory。
  • 正确解法:若路径中有其他需要引号包裹的字符,波浪号应留在引号外部,例如 python3 ~/"my scripts"/app.py,或者改用系统环境变量 "$HOME/my scripts/app.py"。

三、相对路径写法:基于当前工作目录的灵活定位

日常开发中频繁输入长串绝对路径效率较低,相对路径提供了以当前终端所在位置为起点的寻址方式。相对路径不以根目录 / 开头,其解析完全依赖当前工作目录(Current Working Directory,简称 CWD)。

macOS和Linux下通过终端执行Python脚本的路径写法
图 2:基于当前终端工作目录的相对路径三种寻址场景解析

1. 符号含义与常规使用

  • .(单点):指代当前目录。例如 ./test.py 表示当前目录下的 test.py。
  • ..(双点):指代上一级父目录。例如 ../script.py 表示从当前目录退回上一层目录,并执行其中的 script.py。
  • 连续跨层跳转:当需要跳转至祖父目录或平级分支时,可连续叠加双点。例如当前位于 /home/alex/projects/app/tests/,要执行 /home/alex/projects/common/setup.py,其相对路径为:
终端命令示例
python3 ../../common/setup.py

2. 为什么直接执行当前目录脚本必须加 ./?

许多初学者会疑惑:为什么作为参数时可以写 python3 main.py,而赋予脚本可执行权限后,在当前目录下直接输入 main.py 却提示 command not found,必须输入 ./main.py?

底层原因在于环境变量 PATH 的安全机制:

  • 当你在终端中直接键入一个命令(如 ls、python3、main.py)而没有给出任何路径分隔符(/)时,操作系统只会沿着环境变量 $PATH 中预先设定的系统目录列表(如 /usr/bin、/usr/local/bin 等)去逐个寻找该名字的可执行程序。
  • 出于安全防范考虑,macOS 和 Linux 默认绝不会把当前目录 . 包含在 $PATH 环境变量中(防止恶意脚本伪装成 ls 或 cd 诱导管理员误执行)。
  • 一旦命令中包含了正斜杠(哪怕只是开头的 ./),Shell 就会跳过 $PATH 搜索,直接按照给出的具体路径定位当前目录下的物理文件。

四、标准执行流程与特殊字符处理

在工程实践中,目录名或文件名中往往包含空格、特殊标点或非英文字符。如果不加处理直接输入终端,Shell 会将空格解释为参数分隔符,从而导致解释器报错。

macOS和Linux下通过终端执行Python脚本的路径写法
图 3:终端定位与执行 Python 脚本的四个标准化步骤流程

1. 空格与特殊字符的两种正规写法

假设在桌面有名为 Python Projects 的目录,其中存放着 data clean.py 脚本,路径中包含了两个空格:

  • 解法一:反斜杠转义(Escape)
    使用反斜杠 \ 放置在每一个空格前,告诉 Shell 将紧随其后的空格作为纯字符处理,而非参数切分符:
    终端命令示例
    python3 ~/Desktop/Python\ Projects/data\ clean.py
  • 解法二:完整引号包裹(Quoting)
    使用双引号或单引号将包含空格的路径整体括起来:
    终端命令示例
    python3 "/Users/alex/Desktop/Python Projects/data clean.py"
实用操作技巧:拖拽自动生成转义路径

在 macOS 访达(Finder)或各类 Linux 桌面文件管理器中,直接选中脚本文件并用鼠标拖入终端窗口内,系统会自动在光标处插入该文件的完整绝对路径,并自动补全所有空格与特殊符号的反斜杠转义,这是防止手打路径拼写出错的最快方式。

五、直接执行模式:Shebang 与可执行权限中的路径逻辑

在 Linux 和 macOS 开发中,我们常常希望像调用系统命令一样直接输入 ./tool.py 运行脚本,而省略前面的 python3。要实现这种效果,需要满足两个路径层面的先决条件:

1. 脚本首行的 Shebang 路径指令

Shebang 必须位于 .py 文件的第一行,以 #! 开头,向内核指示用哪个解释器来载入该脚本。常见写法有两种:

  • 推荐写法(跨平台动态查找):
    #!/usr/bin/env python3
    /usr/bin/env 是一个系统工具,其路径在所有 POSIX 系统(macOS 与 Linux)中固定不变。它会主动沿着当前终端的 $PATH 变量去搜索首选的 python3(无论是系统预装、Homebrew 安装还是激活的虚拟环境)。
  • 硬编码绝对路径写法:
    #!/usr/bin/python3
    这种写法将解释器死死绑定在系统的 /usr/bin/python3。当用户切换到虚拟环境(venv)或使用 pyenv 多版本管理时,脚本依然会强制使用系统旧版本 Python,缺乏移植灵活性。

2. 赋予执行权限并以路径触发

新建的文件默认只有读写权限(rw),没有执行权限(x)。需在终端通过 chmod 赋予其权限:

赋予执行权限命令
chmod +x script.py

完成授权后,必须给出明确路径才能执行:

执行命令示例
./script.py

六、决策速查与常见报错排查

为了帮助读者在面对不同目录层级与环境需求时快速做出判断,下表整理了常见的路径形式、适用条件与避坑要点:

macOS和Linux下通过终端执行Python脚本的路径写法
图 4:macOS 与 Linux 终端执行 Python 脚本路径决策与排错速查对照

2. 常见终端报错与排查清单

问题一:python3: can't open file '...': [Errno 2] No such file or directory

  • 原因排查:
    1. 相对路径基准起点错误:误以为终端处于脚本所在目录。运行 pwd 确认当前位置,再用 ls -l 路径 检查文件是否存在。
    2. 波浪号被引号屏蔽展开:检查是否输入了 "~/script.py",请修改为 ~/script.py 或 "$HOME/script.py"。
    3. 大小写拼写不匹配:Linux 默认完全区分文件名大小写(Script.py 与 script.py 是不同文件);macOS 默认虽对大小写不敏感,但在跨平台部署时必须严格一致。

问题二:zsh: command not found: test.py

  • 原因排查: 在当前目录下直接运行已经赋予权限的脚本时,遗漏了开头的 ./。系统在 $PATH 环境变量中找不到该命令。正确命令为 ./test.py。

问题三:zsh: permission denied: ./test.py

  • 原因排查: 目标文件没有被授予可执行权限。在终端执行 chmod +x ./test.py 即可解决。

问题四:脚本内部读取相对资源报找不到文件

在终端中通过路径执行脚本时,Python 内部通过 open("data.csv") 打开文件,其相对路径是相对于终端当前的执行目录(CWD),而不是相对于 .py 脚本本身所在的物理目录!

工程化解决方案:在 Python 脚本内部,永远基于 __file__ 构建绝对路径定位配套文件:

Python 代码解耦范例
from pathlib import Path

# 获取当前脚本所在目录的绝对路径,彻底解耦终端执行位置
BASE_DIR = Path(__file__).resolve().parent

# 安全拼接同级数据文件路径
data_file = BASE_DIR / "data.csv"
with open(data_file, "r", encoding="utf-8") as f:
    content = f.read()

掌握了上述绝对路径与相对路径的寻址规则、特殊字符的转义语法,以及基于 Path(__file__) 的解耦策略,便可在 macOS 和 Linux 系统的各类终端与调度环境下游刃有余地执行 Python 脚本。

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表