文件查找与当前工作目录的切换
在执行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.py
在D:\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