文件查找与当前工作目录的切换

在执行python3 hello.py时,大家有可能会看到终端上显示出错误:

$ python3 hello.py
python: can't open file 'hello.py': [Errno 2] No such file or directory.

这和Python解释器的文件查找机制有关。

大家还记得先前提到的“当前工作目录”的概念吗。不记得了可以跳回2.3节去看一眼:终端会在提示符里面显示当前的工作目录。 而当你键入python3 hello.py时,Python解释器会在当前的工作目录里去找hello.py并执行。 而如果你当前工作目录下没有hello.py文件时,Python解释器就会报错了。

假设你有一个文件夹叫做D:\SICP,并且你把我们下发的实验材料的压缩包解压在了这个文件夹中,也就是说你的实验材料都在D:\SICP\lab00下。 如果我们用VSCode打开文件夹D:\SICP,我们在VSCode中打开终端时当前工作目录会被设置为是D:\SICP,在当前的目录下并没有hello.py这个文件。 此时你知道hello.pyD:\SICP\lab00目录下,那么当你执行:

D:\SICP> python3 hello.py

就会出现问题。但如果你当前的工作目录是D:\SICP\lab00,那么你执行:

D:\SICP\lab00> python3 hello.py

就不会有任何问题。那么接下来你就会问,该如何改变当前的工作目录呢?你可以通过cd这个命令切换终端的当前工作目录!

cd的全称是change directory。

一方面,你可以通过cd后跟一个目录的“绝对路径”来把工作目录切换成“绝对路径”所表示的目录。 比如在上面的例子中,如果你当前的工作目录是C:\User\Dell,那么你可以像下面这样切换当前的工作目录到D:\SICP\lab00

C:\User\Dell> D:                 # 注意,不能通过cd切换盘符
D:\> cd D:\SICP\lab00
D:\SICP\lab00> python3 hello.py

什么是绝对路径?像D:\SICP\lab00以盘符(C盘的盘符叫做C:,D盘的盘符叫做D:,以此类推)开头的路径,就叫做绝对路径。否则叫相对路径。

在macOS和Linux中并不存在“盘符”的概念,在这些操作系统中,最底层的文件夹叫做“根目录”(/,也就是“root”),以/开头的路径叫做绝对路径,如/home/user/sicp/lab00

你可能会注意到,Windows上路径的目录之间使用\分割,而macOS和Linux则使用/分割。

另一方面,你也可以通过cd后跟一个目录的“相对路径”来把工作目录切换成“相对路径”所表示的目录。 比如,如果你当前的工作目录为D:\SICP,并且这个目录下还有一个lab00目录,那么你可以像这改变当前的工作目录:

D:\SICP> cd lab00
D:\SICP\lab00>

这里的lab00就是相对路径。这个过程就很像你在资源管理器的SICP目录下双击了lab00目录,然后就进入了lab00目录一样。 如果你的硬盘上不存在目标目录,那么执行cd指令就会显示错误。你可能需要打开资源管理器看看是怎么回事。

如何回到上一级目录中?

在表示目录时,..的含义为上一级目录。.的含义为当前目录。可以使用cd a\b\c这样的形式一口气进入多层目录(a\b\c就是所谓的相对路径)。

C:\SICP\lab00\code> cd ..      # 进入上层目录
C:\SICP\lab00> cd ..           # 再次进入上层目录
C:\SICP> cd lab00\code         # 进入lab00目录下的code目录
C:\SICP\lab00\code> cd ..\..   # 进入上层目录的上层目录
C:\SICP> cd .\lab00            # 进入当前目录的lab00目录
C:\SICP\lab00> cd ..\lab00     # 进入上层目录的lab00目录 (即还是当前目录)
C:\SICP\lab00>

怎么查看当前工作目录下的有哪些目录与文件?

你可以通过ls命令或dir命令(仅Windows)显示当前目录下的文件。

PS D:\sicp\lab00> ls


    目录: D:\sicp\lab00


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2022/9/17     12:04             47 .editorconfig
-a----         2022/9/17      0:26             23 .gitignore
-a----         2022/9/17      0:26             19 hello.py
-a----         2022/9/17      0:26            383 lab00.ok
-a----         2022/9/17      0:26            570 lab00.py