原文:http://inventwithpython.com/beyond/chapter2.html 环境配置是配置你的计算机环境,以便你写代码的过程。这包括安装任何必要的工具,配置它们,以及处理安装过程中的任何问题。没有一键配置这种傻瓜式操作过程,因为每个人都有一台不同的计算机,不同的操作系统、不同操作系统版本 、不同的 Python 解释器版本。尽管如此,本章描述了一些基本概念,帮助您使用命令行、环境变量和文件系统管理自己的计算机。
学习这些概念和工具可能看起来很头疼。您希望编写代码,而不是四处摸索配置设置或理解晦涩的控制台命令。但是从长远来看,这些技巧会节省你的时间。忽略错误消息或随意更改配置设置让系统足能够工作,但这也可能会隐藏问题,但不会修复它们。现在花点时间了解这些问题,可以防止它们再次发生。
文件系统是你的操作系统组织数据存储和检索的方式。一个文件有两个关键属性:一个是文件名(通常写成一个单词)、另一个是路径。路径是指文件在计算机上的位置。例如,我的 Windows 10 笔记本电脑上的一个文件在路径C:\Users\Al\Documents
中的文件名为project.docx
。最后一个句号之后是文件的扩展名,告诉你一个文件的类型。文件名project.docx
为 Word 文档,Users
、Al
、Documents
均引用文件夹(也称目录)。文件夹可以包含文件和其他文件夹。比如project.docx
在Documents
文件夹中,而Documents
又在Al
文件夹中,Al
又在Users
文件夹中。图 2-1 显示了该文件夹的组织结构。
图 2-1:文件夹层次结构中的一个文件
路径的C:
是根文件夹,包含所有其他文件夹。在 Windows 上,根文件夹被命名为C:
,也称为C:
驱动器。在 MacOS 和 Linux 上,根文件夹是/
。在本书中,我将使用 Windows 风格的根文件夹,C:\
。如果您在 MacOS 或 Linux 上输入交互式 Shell 示例,请改为输入/
。
其他卷,如 DVD 驱动器或 USB 闪存驱动器,在不同的操作系统上会有不同的显示。在 Windows 上,它们显示为新的带字母的根驱动器,如D:\
或E:\
。在 MacOS 上,它们作为新文件夹出现在/Volumes
文件夹中。在 Linux 上,它们作为新文件夹出现在/mnt
(“mount”)文件夹中。请注意,在 Windows 和 MacOS 上,文件夹名称和文件名不区分大小写,但在 Linux 上是区分大小写的。
在 Windows 上,反斜杠(\
)分隔文件夹和文件名,但在 MacOS 和 Linux 上,正斜杠(/
)分隔它们。您可以使用pathlib
模块和/
操作符,而不是用两种方式编写代码来使您的 Python 脚本跨平台兼容。
导入pathlib
的典型方式是使用语句from pathlib import Path
。因为Path
类是pathlib
中使用最频繁的类,这可以让你输入Path
,而不是pathlib.Path
。您可以将文件夹或文件名的字符串传递给Path()
来创建该文件夹或文件名的Path
对象。只要表达式中最左边的对象是一个Path
对象,就可以使用/
操作符将Path
对象或字符串连接在一起。在交互式 Shell 中输入以下内容:`
>>> from pathlib import Path
>>> Path('spam') / 'bacon' / 'eggs'
WindowsPath('spam/bacon/eggs')
>>> Path('spam') / Path('bacon/eggs')
WindowsPath('spam/bacon/eggs')
>>> Path('spam') / Path('bacon', 'eggs')
WindowsPath('spam/bacon/eggs')
注意,因为我在 Windows 机器上运行了这段代码,Path()
返回了WindowsPath
对象。在 MacOS 和 Linux 上,返回一个PosixPath
对象。(POSIX 是一组用于类 Unix 操作系统的标准,超出了本书的范围。)就我们的目的而言,这两种类型没有区别。
您可以将一个Path
对象传递给 Python 标准库中任何需要文件名的函数。例如,函数调用open(Path('C:\\') / 'Users' / 'Al' / 'Desktop' / 'spam.py')
相当于open(r'C:\Users\Al\Desktop\spam.py')
。
所有用户在电脑上都有一个名为主文件夹或主目录的文件夹来存放他们自己的文件。您可以通过调用Path.home()
来获得主文件夹的一个Path
对象:
>>> Path.home()
WindowsPath('C:/Users/Al')
主目录位于一个固定的位置,具体取决于您的操作系统:
C:\Users
中。/Users
中。/home
中。主目录中的文件您基本上肯定有读写权限,因此这是存储和使用您的 Python 脚本的理想位置。
你电脑上运行的每个程序都有一个当前工作目录(cwd
)。任何不以根文件夹开头的文件名或路径都在 CWD 中。虽然“文件夹”是一个目录的更流行的名字,但是注意 CWD(或者仅仅是工作目录)是标准术语,而不是“当前工作文件夹”
您可以使用Path.cwd()
函数将 CWD 作为一个Path
对象,并使用os.chdir()
对其进行更改。在交互式 Shell 中输入以下内容:
>>> from pathlib import Path
>>> import os
>>> Path.cwd() # 1
WindowsPath('C:/Users/Al/AppData/Local/Programs/Python/Python38')
>>> os.chdir('C:\\Windows\\System32') # 2
>>> Path.cwd()
WindowsPath('C:/Windows/System32')
这里 CWD 设置为C:\ Users\Al\AppData\Local\Programs\Python\Python38
1,所以文件名project.docx
会引用C:\ Users\Al\AppData\Local\Programs\Python\Python38\project.docx
。当我们将 CWD 改为C:\Windows\System32
2 时,文件名project.docx
将引用C:\Windows\System32\project.docx
。
如果您尝试切换到不存在的目录,Python 会显示错误:
>>> os.chdir('C:/ThisFolderDoesNotExist')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [WinError 2] The system cannot find the file specified:
'C:/ThisFolderDoesNotExist'
os
模块中的os.getcwd()
函数是以前获取字符串形式的 CWD 的方法。
有两种方法可以指定文件路径:
还有点(.
)和点点(..
)文件夹。这些不是真正的文件夹,而是可以在路径中使用的特殊名称。单个句号(.
)是“此目录”的简写,两个句号(..
)表示“父文件夹”
图 2-2 显示了一些文件夹和文件的例子。当 CWD 被设置为C:\bacon
时,其他文件夹和文件的相对路径被设置为如图所示。
.
相对路径的开头是可选的。例如,.\spam.txt
和spam.txt
引用同一个文件。
图 2-2:工作目录下文件夹和文件的相对路径C:\bacon
一个程序是你可以运行的任何软件应用,比如网络浏览器、电子表格应用或文字处理器。一个进程是一个程序的运行实例。例如,图 2-3 显示了同一个计算器程序的五个进程示例。
图 2-3:一个计算器程序作为多个独立的进程运行多次
即使运行同一个程序,进程也保持相互独立。例如,如果您同时运行一个 Python 程序的几个实例,每个进程可能会有单独的变量值。每个进程,甚至运行相同程序的进程,都有自己的 CWD 和环境变量设置。一般来说,一个命令行一次只能运行一个进程(尽管您可以同时打开多个命令行)。
每个操作系统都有查看正在运行的进程列表的方式。在 Windows 上,你可以按Ctrl-Shift-Esc
调出任务管理器应用。在 MacOS 上,您可以运行应用实用工具活动监视器。在 Ubuntu Linux 上,你可以按Ctrl-Alt-Del
打开一个应用,也叫任务管理器。如果进程没有响应,这些任务管理器可以强制终止正在运行的进程。
命令行是一个基于文本的程序,让你输入命令与操作系统交互并运行程序。你也可能听说过命令行界面(CLI,发音为“fly”)、命令提示符、终端、Shell 或控制台。它为图形用户界面(GUI,发音为“gooey”)提供了一种替代方式,这种图形界面允许用户更加友好的方式与用户交互(相对 CLI 来说)。与命令行相比,GUI 向用户提供可视信息,引导他们更轻松地完成任务。大部分电脑用户都把命令行当做高级功能,从来不碰。不愿意用的一部分原因是由于完全缺乏如何使用它的提示;因为 GUI 可能会显示一个按钮,告诉您点击哪里,但是空白的终端窗口不会提醒您键入什么。
但是有很好的理由来熟练使用命令行。首先,设置您的环境通常需要您使用命令行,而不是图形窗口。另一方面,输入命令比用鼠标点击图形窗口要快得多。基于文本的命令也比将一个图标拖到另一个图标上更明确。这有助于更好地实现自动化,因为您可以将多个特定的命令组合成脚本来执行复杂的操作。
命令行程序存在于计算机的可执行文件中。在这种情况下,我们通常称之为 shell 或 shell 脚本。运行 Shell 脚本会出现终端窗口提示符:
C:\Windows\System32\cmd.exe
。/bin/bash
。/bin/bash
。多年来,程序员为 Unix 操作系统创建了许多 Shell 程序,例如 Bourne Shell(在一个名为sh
的可执行文件中)以及后来的 Bourne-Again Shell(在一个名为Bash
的可执行文件中)。Linux 默认使用 Bash,而 MacOS 在 Catalina 和更高版本中使用类似的 Zsh 或 ZShell。由于不同的开发历史,Windows 使用一个名为命令提示符的 shell。所有这些程序都做同样的事情:它们提供一个带有基于文本的 CLI 的终端窗口,用户可以在其中输入命令并运行程序。
在本节中,您将学习一些命令行的基本概念和常用命令。你可以掌握大量的神秘命令来成为一名真正的魔术师,但是你只需要知道十几个就可以解决大多数问题。在不同的操作系统上,确切的命令名称可能略有不同,但基本概念是相同的。
要打开终端窗口,请执行以下操作:
Command Prompt
,然后按回车。Spotlight
图标,输入Terminal
,然后按回车。Terminal
,按回车。或者,使用键盘快捷键Ctrl+Alt+T
与 Python 显示>>>
提示符的交互式 Shell 一样,终端显示一个 Shell 提示符,在这里您可以输入命令。在 Windows 上,提示将是您所在的当前文件夹的完整路径:
C:\Users\Al>your commands go here
在 MacOS 上,提示符显示您的电脑名称、冒号和 CWD,您的个人文件夹用波浪号(~
)表示。这是您的用户名,后面是美元符号($
):
Als-MacBook-Pro:~ al$ your commands go here
在 Ubuntu Linux 上,提示符类似于 MacOS 提示符,只是它以用户名和 AT(@
)符号开头:
email@protected:~$ your commands go here
许多书籍和教程将命令行提示符表示为$
来简化它们的例子。可以定制这些提示符,但是这样做超出了本书的讨论范围。
要运行程序或命令,请在命令行中输入其名称。让我们运行操作系统自带的默认计算器程序。在命令行中输入以下内容:
calc.exe
。open -a Calculator
。(从技术上讲,这运行了open
程序,然后该程序运行计算器程序。)gnome-calculator
。程序名和命令在 Linux 上区分大小写,但在 Windows 和 MacOS 上不区分大小写。这意味着你必须在 Linux 上输入gnome-calculator
,但你也可以在 Windows 上输入Calc.exe
,也在 MacOS 上输入OPEN –a Calculator
。
在命令行中输入这些计算器程序名相当于从开始菜单、Finder 或 Dash 中运行计算器程序。这些计算器程序名作为命令工作,因为calc.exe
、open
和gnome-calculator
程序存在于包含在PATH
环境变量中的文件夹中。第 35 页的“环境变量和路径”对此有进一步的解释。但是可以说,当您在命令行上输入一个程序名时,Shell 会检查在PATH
中列出的某个文件夹中是否存在具有该名称的程序。在 Windows 上,Shell 在检查PATH
中的文件夹之前,会在 CWD(你可以在提示中看到)中查找程序。要告诉 MacOS 和 Linux 上的命令行首先检查 CWD,必须在文件名前输入./
。
如果程序不在PATH
中列出的文件夹中,您有两种选择:
使用cd
命令将 CWD 更改为包含程序的文件夹,然后输入程序名。例如,您可以输入以下两个命令:
`cd C:\Windows\System32`
`calc.exe`
输入可执行程序文件的完整文件路径。例如,您可以输入C:\Windows\System32\calc.exe
,而不是输入calc.exe
。
在 Windows 上,程序文件的扩展名以.exe
或者.bat
结尾,扩展名是可选的:输入calc
与输入calc.exe
的作用相同。MacOS 和 Linux 中的可执行程序通常没有将它们标记为可执行的文件扩展名;相反,他们拥有可执行权限集。第 39 页的“不使用命令行运行 Python 程序”有更多信息。
命令行参数是您在命令名后输入的文本。像传递给 Python 函数调用的参数一样,它们为命令提供了特定的选项或附加的指示。例如,当您运行命令cd C:\Users
时,C:\Users
是cd
命令的一个参数,它告诉cd
将 CWD 更改到哪个文件夹。或者,当您使用python yourScript.py
命令从终端窗口运行 Python 脚本时,yourScript.py
部分是一个参数,它告诉python
程序应该执行哪个脚本。
命令行选项(也称为标志、开关或简单的选项)是一个单字母或短单词的命令行参数。在 Windows 上,命令行选项往往以正斜杠(/
)开头;在 MacOS 和 Linux 上,它们以单破折号(–
)或双破折号(--
)开始。在运行 MacOS 命令open –a Calculator
时,您已经使用了–a
选项。命令行选项在 MacOS 和 Linux 上通常区分大小写,但在 Windows 上不区分大小写,我们用空格分隔多个命令行选项。
文件夹和文件名是常见的命令行参数。如果文件夹或文件名的名称中包含空格,请用双引号将名称括起来,以避免混淆命令行。例如,如果您想将目录更改为名为Vacation Photos
的文件夹,输入cd Vacation Photos
会让命令行认为您在传递两个参数,Vacation
和Photos
。因此,您应该输入cd "Vacation Photos"
:
C:\Users\Al>cd "Vacation Photos"
C:\Users\Al\Vacation Photos>
许多命令的另一个常见参数是 MacOS 和 Linux 上的--help
和 Windows 上的/?
。这些将显示与命令相关的信息。例如,如果您在 Windows 上运行cd /?
,Shell 会告诉您cd
命令是做什么的,并列出它的其他命令行参数:
C:\Users\Al>cd /?
Displays the name of or changes the current directory.
CHDIR [/D] [drive:][path]
CHDIR [..]
CD [/D] [drive:][path]
CD [..]
.. Specifies that you want to change to the parent directory.
Type CD drive: to display the current directory in the specified drive.
Type CD without parameters to display the current drive and directory.
Use the /D switch to change current drive in addition to changing current
directory for a drive.
`--snip—`
该帮助信息告诉我们,Windows cd
命令也叫做chdir
。(简化的cd
命令做同样的事情时,大多数人不会键入chdir
。)方括号包含可选参数。例如,CD [/D] [drive:][path]
告诉你可以使用/D
选项指定一个驱动器或路径。
不幸的是,尽管命令的/?
和--help
信息为有经验的用户提供了提醒,但解释通常是含糊的。对于初学者来说,它们不是很好的资源。你最好使用书籍或网络教程,如威廉·肖特的《Linux 命令行》第二版(2019 年)、OccupyTheWeb 的《Linux 黑客基础知识》(2018 年)或亚当·伯特伦的《系统管理员的 PowerShell》(2020 年),所有这些都来自 No Starch 出版社。
-c
从命令行运行 Python 代码如果您需要运行少量一次性的 Python 代码,运行一次后就丢弃,那么在 Windows 上把–c
开关传递给python.exe
或者在 MacOS 和 Linux 上传递给python3
。要运行的代码应该在–c
开关之后,用双引号括起来。例如,在终端窗口中输入以下内容:
C:\Users\Al>python -c "print('Hello, world')"
Hello, world
当您想要查看单个 Python 指令的结果,并且不想浪费时间进入交互式 Shell 时,–c
开关非常方便。例如,您可以快速显示help()
函数的输出,然后返回到命令行:
C:\Users\Al>python -c "help(len)"
Help on built-in function len in module builtins:
len(obj, /)
Return the number of items in a container.
C:\Users\Al>
Python 程序是带有.py
文件扩展名。它们不是可执行文件;相反,Python 解释器读取这些文件并执行其中的 Python 指令。在 Windows 上,解释器的可执行文件是python.exe
。在 MacOS 和 Linux 上,是python3
(原始python
文件包含 python2 版本解释器)。运行命令python yourScript.py
或python3 yourScript.py
将运行保存在名为yourScript.py
的文件中的 Python 指令。
py.exe
程序在 Windows 上,Python 会在C:\Windows
文件夹中安装一个py.exe
程序。这个程序与python.exe
相同,但是接受一个额外的命令行参数,让你运行你的计算机上安装的任何 Python 版本。您可以从任何文件夹运行py
命令,因为C:\Windows
文件夹包含在PATH
环境变量中。如果您安装了多个 Python 版本,运行py
会自动运行您计算机上安装的最新版本。您还可以传递一个-3
或-2
命令行参数来分别运行最新安装的 Python3 版本或 Python2 版本。或者您可以输入一个更具体的版本号,比如-3.6
或-2.7
,来运行那个特定的 Python 版本。在版本切换之后,您可以将所有相同的命令行参数传递给py.exe
,就像您传递给python.exe
一样。从 Windows 命令行运行以下命令:
C:\Users\Al>py -3.6 -c "import sys;print(sys.version)"
3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)]
C:\Users\Al>py -2.7
Python2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
当您在 Windows 机器上安装了多个 Python 版本,并且需要运行一个特定的版本时,py.exe
程序非常有用。
Python 的subprocess.run()
函数可以在subprocess
模块中找到,它可以在 Python 程序中运行 Shell 命令,然后将命令输出显示为字符串。例如,下面的代码运行ls –al
命令:
>>> import subprocess, locale
>>> procObj = subprocess.run(['ls', '-al'], stdout=subprocess.PIPE) # 1
>>> outputStr = procObj.stdout.decode(locale.getdefaultlocale()[1]) # 2
>>> print(outputStr)
total 8
drwxr-xr-x 2 al al 4096 Aug 6 21:37 .
drwxr-xr-x 17 al al 4096 Aug 6 21:37 ..
-rw-r--r-- 1 al al 0 Aug 5 15:59 spam.py
我们将['ls', '-al']
列表传递给subprocess.run()
1 。这个列表包含命令名ls
,后面是它的参数,作为单独的字符串。注意,通过['ls –al']
是不行的。我们将命令的输出作为字符串存储在outputStr
2 中。subprocess.run()
和locale.getdefaultlocale()
的在线文档会让你更好地了解这些函数是如何工作的,但是它们让代码可以在任何运行 Python 的操作系统上工作。
因为高级用户一天要花几个小时向计算机输入命令,所以现代命令行提供的功能可以最大限度地减少必要的打字量。 TAB 补全功能(也称为命令行补全或自动补全)允许用户键入文件夹或文件名的前几个字符,然后按下Tab
键,让 Shell 填充名称的其余部分。
例如,当您在 Windows 上键入cd c:\u
并按下Tab
时,当前命令会检查C:\
中的哪些文件夹或文件以u
开始,Tab 会补全为c:\Users
。它还将小写的u
更正为U
。(在 MacOS 和 Linux 上,制表符补全不会纠正大小写。)如果在C:\
文件夹中有多个文件夹或文件名以U
开头,您可以继续按Tab
在它们之间循环。为了缩小备选数量,你也可以输入cd c:\us
,过滤以us
开头的文件夹和文件名。
多次按下键键在 MacOS 和 Linux 上同样有效。在下面的例子中,用户输入了cd D
,然后输入了两次标签:
email@protected:~$ cd D
Desktop/ Documents/ Downloads/
email@protected:~$ cd D
键入D
后按两次键会导致外壳显示所有可能的匹配。到目前为止,Shell 为您提供了一个新的命令提示符。此时,您可以键入e
,然后按下Tab
键让 Shell 完成cd Desktop/
命令。
制表符补全是如此有用,以至于许多 GUI IDEs 和文本编辑器也包括这个特性。与命令行不同,这些 GUI 程序通常在您键入单词时在您的单词下显示一个下拉菜单,让您选择一个来补全命令的完成其余部分。
在命令历史中,现代 shells 还会记住你输入的命令。在终端中按下向上箭头键,用您输入的最后一个命令填充命令行。您可以继续按向上箭头键查找以前的命令,或者按向下箭头键返回到最近的命令。如果想取消当前提示符下的命令,从一个新的提示符开始,按下Ctrl+C
在 Windows 上,您可以通过运行doskey /history
来查看命令历史。(这个奇怪命名的doskey
程序可以追溯到微软 Windows 操作系统之前的 MS-DOS。)在 MacOS 和 Linux 上,可以通过运行history
命令来查看命令历史。
本节包含您将在命令行中使用的常用命令的简短列表。这里列出的命令和参数要多得多,但是您可以将它们视为导航命令行所需的最基本的东西。
本节中命令的命令行参数出现在方括号中。例如,cd [destination folder]
表示您应该输入cd
,后跟新文件夹的名称。
许多命令接受文件夹和文件名作为命令行参数。通常,这些命令也接受带有通配符*
和?
的名称,允许您指定多个匹配的文件。*
字符匹配任意数量的字符,而?
字符匹配任意单个字符。我们将使用*
和?
通配符的表达式称为 Glob 模式(“全局模式”的简称)。
Glob 模式允许您指定文件名的模式。例如,您可以运行dir
或ls
命令来显示 CWD 中的所有文件和文件夹。但是如果你只想查看 Python 文件,dir *.py
或ls *.py
将只显示以.py
结尾的文件 。Glob 模式*.py
表示“任何一组字符,后跟.py
:
C:\Users\Al>dir *.py
Volume in drive C is Windows
Volume Serial Number is DFF3-8658
Directory of C:\Users\Al
03/24/2019 10:45 PM 8,399 conwaygameoflife.py
03/24/2019 11:00 PM 7,896 test1.py
10/29/2019 08:18 PM 21,254 wizcoin.py
3 File(s) 37,549 bytes
0 Dir(s) 506,300,776,448 bytes free
Glob 模式下records201?.txt
的意思是records201
,后面跟任意单个字符,再后面跟.txt
这将匹配年份为records2010.txt
到records2019.txt
的记录文件(以及文件名,如records201X.txt
)。Glob 模式records20??.txt
将匹配任意两个字符,例如records2021.txt
或records20AB.txt
。
cd
命令更改目录运行cd [destination folder]
将 Shell 的 CWD 更改到目标文件夹:
C:\Users\Al>cd Desktop
C:\Users\Al\Desktop>
Shell 将 CWD 显示为其提示的一部分,命令中使用的任何文件夹或文件都将被解释为与该目录相关。
如果文件夹名称中有空格,请用双引号将名称括起来。要将 CWD 更改为用户的主文件夹,在 MacOS 和 Linux 上输入cd ~
,在 Windows 上输入cd %USERPROFILE%
。
在 Windows 上,如果您还想更改当前驱动器,首先需要以单独命令的形式输入驱动器名:
C:\Users\Al>d:
D:\>cd BackupFiles
D:\BackupFiles>
要切换到 CWD 的父目录,请使用..
文件夹名称:
C:\Users\Al>cd ..
C:\Users>
dir
和ls
列出文件夹内容在 Windows 上,dir
命令显示 CWD 中的文件夹和文件。在 MacOS 和 Linux 上,ls
命令做同样的事情。运行dir [another folder]
或ls [another folder]
可以显示另一个文件夹的内容。
-l
和-a
选项是ls
命令的有用参数。默认情况下,ls
仅显示文件和文件夹的名称。要显示包含文件大小、权限、最后修改时间戳和其他信息的长列表格式,请使用–l
。按照惯例,MacOS 和 Linux 操作系统将以句号开头的文件视为配置文件,并在普通命令中隐藏它们。您可以使用-a
让ls
显示所有文件,包括隐藏的文件。要显示长列表格式和所有文件,将开关组合成ls -al
。以下是 MacOS 或 Linux 终端窗口中的一个示例:
email@protected:~$ ls
Desktop Downloads mu_code Pictures snap Videos
Documents examples.desktop Music Public Templates
email@protected:~$ ls -al
total 112
drwxr-xr-x 18 al al 4096 Aug 4 18:47 .
drwxr-xr-x 3 root root 4096 Jun 17 18:11 ..
-rw------- 1 al al 5157 Aug 2 20:43 .bash_history
-rw-r--r-- 1 al al 220 Jun 17 18:11 .bash_logout
-rw-r--r-- 1 al al 3771 Jun 17 18:11 .bashrc
drwx------ 17 al al 4096 Jul 30 10:16 .cache
drwx------ 14 al al 4096 Jun 19 15:04 .config
drwxr-xr-x 2 al al 4096 Aug 4 17:33 Desktop
`--snip--`
与ls –al
类似的窗口是dir
命令。以下是 Windows 终端窗口中的一个示例:
C:\Users\Al>dir
Volume in drive C is Windows
Volume Serial Number is DFF3-8658
Directory of C:\Users\Al
06/12/2019 05:18 PM <DIR> .
06/12/2019 05:18 PM <DIR> ..
12/04/2018 07:16 PM <DIR> .android
`--snip--`
08/31/2018 12:47 AM 14,618 projectz.ipynb
10/29/2014 04:34 PM 121,474 foo.jpg
dir
列出子文件夹内容并查找在 Windows 上,运行dir /s
会显示 CWD 的文件夹及其子文件夹。例如,以下命令显示C:\github\ezgmail
文件夹及其所有子文件夹中的 py 文件:
C:\github\ezgmail>dir /s *.py
Volume in drive C is Windows
Volume Serial Number is DEE0-8982
Directory of C:\github\ezgmail
06/17/2019 06:58 AM 1,396 setup.py
1 File(s) 1,396 bytes
Directory of C:\github\ezgmail\docs
12/07/2018 09:43 PM 5,504 conf.py
1 File(s) 5,504 bytes
Directory of C:\github\ezgmail\src\ezgmail
06/23/2019 07:45 PM 23,565 __init__.py
12/07/2018 09:43 PM 56 __main__.py
2 File(s) 23,621 bytes
Total Files Listed:
4 File(s) 30,521 bytes
0 Dir(s) 505,407,283,200 bytes free
在 MacOS 和 Linux 上,find . –name
命令做同样的事情:
email@protected:~/Desktop$ find . -name "*.py"
./someSubFolder/eggs.py
./someSubFolder/bacon.py
./spam.py
.
告诉find
开始在 CWD 中搜索。–name
选项告诉find
按名称查找文件夹和文件名字。*.py
告诉find
显示名称与*.py
模式匹配的文件夹和文件。注意find
命令要求–name
后面的参数用双引号括起来。
copy
和cp
复制文件和文件夹要在不同的目录中创建文件或文件夹的副本,请运行copy [source file or folder] [destination folder]
或者cp [source file or folder] [destination folder]
。以下是 Linux 终端窗口中的一个示例:`
email@protected:~/someFolder$ ls
hello.py someSubFolder
email@protected:~/someFolder$ cp hello.py someSubFolder
email@protected:~/someFolder$ cd someSubFolder
email@protected:~/someFolder/someSubFolder$ ls
hello.py
当我开始学习 Linux 操作系统时,我惊讶地发现,我所熟知的 Windows copy
命令在 Linux 上被命名为cp
。copy
这个名字比cp
更易读,一个简洁、隐晦的名字真的值得节省两个字符的输入吗?
随着我在命令行方面的经验越来越丰富,我意识到答案是肯定的。我们读源代码的次数比写源代码的次数多,所以对变量和函数使用冗长的名字会有所帮助。但是我们在命令行中输入命令的次数比阅读命令的次数多,所以在这种情况下,情况正好相反:简短的命令名称使命令行更容易使用,并减少手腕的压力。
move
和mv
移动文件和文件夹在 Windows 上,您可以通过运行move [source file or folder] [destination folder]
将源文件或文件夹移动到目标文件夹。在 MacOS 和 Linux 上,mv [source file or folder] [destination folder]
命令做同样的事情。
`以下是 Linux 终端窗口中的一个示例:
email@protected:~/someFolder$ ls
hello.py someSubFolder
email@protected:~/someFolder$ mv hello.py someSubFolder
email@protected:~/someFolder$ ls
someSubFolder
email@protected:~/someFolder$ cd someSubFolder/
email@protected:~/someFolder/someSubFolder$ ls
hello.py
hello.py
文件已经从~/someFolder
移动到~/somefolder/somesubfolder
中,源目录中的这个文件已经被移走。
ren
和mv
重命名文件和文件夹运行ren [file or folder] [new name]
在 Windows 上重命名文件或文件夹,mv [file or folder] [new name]
在 MacOS 和 Linux 上也这么做。请注意,您可以在 MacOS 和 Linux 上使用mv
命令来移动和重命名文件。如果您为第二个参数提供一个现有文件夹的名称,mv
命令会将文件或文件夹移动到那里。如果您提供的名称与现有文件或文件夹不匹配,mv
命令会重命名该文件或文件夹。以下是 Linux 终端窗口中的一个示例:
email@protected:~/someFolder$ ls
hello.py someSubFolder
email@protected:~/someFolder$ mv hello.py goodbye.py
email@protected:~/someFolder$ ls
goodbye.py someSubFolder
这个hello.py
文件现在的名字是goodbye.py
。
del
和rm
删除文件和文件夹要删除 Windows 上的文件或文件夹,请运行del [file or folder]
。要在 MacOS 和 Linux 上这样做,运行rm [file]
(rm
是“remove”的简称)。
这两个删除命令略有不同。在 Windows 上,对文件夹运行del
会删除其所有文件,但不会删除其子文件夹。del
命令也不会删除源文件夹;你必须使用rd
或rmdir
命令,我将在第 34 页的“使用rd
和rmdir
删除文件夹”中解释。此外,运行del
不会删除源文件夹的子文件夹中的任何文件。运行del /s /q [folder]
可以删除文件。/s
在子文件夹上运行del
命令,/q
本质上意味着“安静,不要让我确认。”图 2-4 说明了这种差异。
图 2-4:运行del delicious
(左)或del /s /q delicious
(右)时,这些示例文件夹中的文件被删除。
在 MacOS 和 Linux 上,不能使用rm
命令删除文件夹。但是你可以运行rm –r [folder]
来删除一个文件夹及其所有内容。在 Windows 上,rd /s /q [folder]
也会做同样的事情。图 2-5 说明了这项任务。
图 2-5:当您运行rd /s /q delicious
或rm –r delicious
时,这些示例文件夹中的文件被删除。
md
和mkdir
新建文件夹在 Windows 上运行md [new folder]
会创建一个新的空文件夹,在 MacOS 和 Linux 上运行mkdir [new folder]
也会这样做。mkdir
命令也适用于 Windows,但是md
更容易输入。
以下是 Linux 终端窗口中的一个示例:
email@protected:~/Desktop$ mkdir yourScripts
email@protected:~/Desktop$ cd yourScripts
email@protected:~/Desktop/yourScripts$ ls # 1
email@protected:~/Desktop/yourScripts$
注意,新创建的yourScripts
文件夹是空的;当我们运行ls
命令来列出文件夹的内容时,什么也没有。
rd
和rmdir
删除文件夹运行rd [source folder]
删除 Windows 上的源文件夹,rmdir [source folder]
删除 MacOS 和 Linux 上的源文件夹。像mkdir
一样,rmdir
命令也适用于 Windows,但是rd
更容易输入。文件夹必须是空的,才能删除它。
以下是 Linux 终端窗口中的一个示例:
email@protected:~/Desktop$ mkdir yourScripts
email@protected:~/Desktop$ ls
yourScripts
email@protected:~/Desktop$ rmdir yourScripts
email@protected:~/Desktop$ ls
email@protected:~/Desktop$
在本例中,我们创建了一个名为yourScripts
的空文件夹,然后删除了它。
要删除非空文件夹(以及其中包含的所有文件夹和文件),请在 Windows 上运行rd /s/q [source folder]
,或者在 MacOS 和 Linux 上运行rm –rf [source folder]
。
where
和which
查找程序在 Windows 上运行where [program]
或者在 MacOS 和 Linux 上运行which [program]
会告诉你程序的确切位置。当你在命令行输入一个命令时,你的计算机会在PATH
环境变量中列出的文件夹中检查这个程序(尽管 Windows 会先检查 cwd)。
这些命令可以告诉你在 Shell 中输入python
时运行的是哪个可执行的 Python 程序。如果您安装了多个 Python 版本,您的计算机可能会有多个同名的可执行程序。运行哪一个取决于您的PATH
环境变量中文件夹的顺序,并且where
和which
命令将输出它:
C:\Users\Al>where python
C:\Users\Al\AppData\Local\Programs\Python\Python38\python.exe
在本例中,文件夹名称表明从 Shell 运行的 Python 版本位于C:\ Users\Al\AppData\Local\Programs\Python\Python38
。
cls
和clear
清除终端在 Windows 上运行cls
或在 MacOS 和 Linux 上运行clear
将清除终端窗口中的所有文本。如果你只是想从一个新的终端窗口开始,这是很有用的。
一个程序的所有正在运行的进程,不管它是用什么语言编写的,都有一组叫做环境变量的变量,可以存储一个字符串。环境变量通常包含系统范围的设置,每个程序都会发现这些设置很有用。例如,TEMP
环境变量保存任何程序可以存储临时文件的文件路径。当操作系统运行一个程序(如命令行)时,新创建的进程接收它自己的操作系统环境变量和值的副本。您可以独立于操作系统的环境变量集来更改进程的环境变量。但是这些变化只适用于进程,而不适用于操作系统或任何其他进程。
我在这一章中讨论环境变量是因为这样一个变量,可以帮助你从命令行运行你的程序。
您可以通过从命令行运行set
(在 Windows 上)或env
(在 MacOS 和 Linux 上)来查看终端窗口的环境变量列表:
C:\Users\Al>set
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\Al\AppData\Roaming
CommonProgramFiles=C:\Program Files\Common Files
`--snip--`
USERPROFILE=C:\Users\Al
VBOX_MSI_INSTALL_PATH=C:\Program Files\Oracle\VirtualBox\
windir=C:\WINDOWS
等号(=
)左边的文字是环境变量名,右边的文字是字符串值。每个进程都有自己的一组环境变量,因此不同的命令行可以有不同的环境变量值。
您也可以使用echo
命令查看单个环境变量的值。在 Windows 上运行echo %HOMEPATH %
,在 MacOS 和 Linux 上运行echo $HOME
,分别查看HOMEPATH
或HOME
环境变量的值,这些变量包含当前用户的主文件夹。在 Windows 上,它看起来像这样:
C:\Users\Al>echo %HOMEPATH%
\Users\Al
在 MacOS 或 Linux 上,它看起来像这样:
email@protected:~$ echo $HOME
/home/al
如果该进程创建了另一个进程(例如当命令行运行 Python 解释器时),则该子进程会收到其自己的父进程环境变量的副本。子进程可以更改其环境变量的值,而不会影响父进程的环境变量,反之亦然。
您可以将操作系统的环境变量集视为“主副本”,进程从该副本复制其环境变量。操作系统的环境变量的变化没有 Python 程序频繁。事实上,大多数用户从不会直接接触他们的环境变量设置。
PATH
环境变量当你输入一个命令,比如 Windows 上的python
或者 MacOS 和 Linux 上的python3
,终端会在你当前所在的文件夹中查找一个具有该名称的程序。如果没有找到,它将检查列在PATH
环境变量中的文件夹。
比如在我的 Windows 电脑上,python.exe
程序文件位于C:\ Users\Al\AppData\Local\Programs\Python\Python38
文件夹中。要运行它,我必须输入C:\Users\Al\AppData\Local\Programs\Python\Python38\python.exe
,或者先切换到那个文件夹,然后输入python.exe
。
这个冗长的路径名需要大量的输入,所以我将这个文件夹添加到环境变量PATH
中。然后,当我输入python.exe
时,命令行会在PATH
中列出的文件夹中搜索具有该名称的程序,使我不必键入完整的文件路径。
因为环境变量只能包含一个字符串值,所以向PATH
环境变量添加多个文件夹名需要使用特殊的格式。在 Windows 上,分号分隔文件夹名称。您可以使用path
命令查看当前的PATH
值:
C:\Users\Al>path
C:\Path;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;
`--snip--`
C:\Users\Al\AppData\Local\Microsoft\WindowsApps
在 MacOS 和 Linux 上,冒号分隔文件夹名称:
email@protected:~$ echo $PATH
/home/al/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
文件夹名称的顺序很重要。如果我在C:\WINDOWS\system32
和C:\WINDOWS
中有两个名为someProgram.exe
的文件,输入someProgram.exe
将运行C:\WINDOWS\system32
中的程序,因为该文件夹首先出现在PATH
环境变量中。
如果你输入的程序或命令不在 CWD 或PATH
中列出的任何目录中,命令行会给你一个错误,比如command not found
或not recognized as an internal or external command
。如果你没有打错字,检查哪个文件夹包含该程序,看看它是否出现在PATH
环境变量中。
PATH
环境变量您可以更改当前终端窗口的PATH
环境变量,以包含其他文件夹。向PATH
添加文件夹的过程在 Windows 和 MacOS/Linux 之间略有不同。在 Windows 上,你可以运行path
命令来添加一个新的文件夹到当前的PATH
值:
C:\Users\Al>path C:\newFolder;%PATH% # 1
C:\Users\Al>path # 2
C:\newFolder;C:\Path;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;
`--snip--`
C:\Users\Al\AppData\Local\Microsoft\WindowsApps
%PATH%
部分 1 扩展为PATH
环境变量的当前值,所以您要在现有的PATH
值的开头添加新的文件夹和分号。您可以再次运行path
命令来查看PATH
2 的新值。
在 MacOS 和 Linux 上,您可以使用类似于 Python 中赋值语句的语法来设置PATH
环境变量:
email@protected:~$ PATH=/newFolder:$PATH # 1
email@protected:~$ echo $PATH # 2
/newFolder:/home/al/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
PATH部分 1 扩展为PATH环境变量的当前值,因此您要向现有的PATH值添加新文件夹和冒号。您可以再次运行echo PATH命令来查看PATH的新值 2 。
但是前两种添加文件夹到PATH
的方法只适用于当前的终端窗口,以及添加后从该窗口运行的任何程序。如果您打开一个新的终端窗口,它不会有您的更改。永久添加文件夹需要更改操作系统的环境变量集合。
PATH
环境变量Windows 有两组环境变量:系统环境变量(适用于所有用户)和用户环境变量(覆盖系统环境变量,但仅适用于当前用户)。要编辑它们,点击开始菜单,然后输入Edit environment variables for your account
,这将打开环境变量窗口,如图 2-6 所示。
从用户变量列表(不是系统变量列表)中选择路径,点击编辑,在出现的文本字段中添加新文件夹名称(不要忘记分号分隔符),点击确定。
这个界面不是最容易使用的,所以如果你经常在 Windows 上编辑环境变量,我推荐你安装www.rapidee.com
的免费快速环境编辑器软件。请注意,安装后,您必须以管理员身份运行该软件来编辑系统环境变量。点击开始菜单,输入Rapid Environment Editor
,右击软件图标,点击以管理员身份运行。
在命令提示符下,您可以使用setx
命令永久修改系统变量PATH
:
C:\Users\Al>setx /M PATH "C:\newFolder;%PATH%"
您需要以管理员身份运行命令提示符来运行setx
命令。
图 2-6:Windows 上的环境变量窗口
PATH
变量永久添加文件夹要将文件夹添加到 MacOS 和 Linux 上所有终端窗口的PATH
环境变量中,您需要修改.bashrc
文本文件,并添加下面一行:
export PATH=/newFolder:$PATH
这一行修改将会应用到所有未来终端窗口的PATH
环境变量。在 MacOS Catalina 和更高版本上,默认的 Shell 程序已经从 Bash 变成了 ZShell,所以您需要修改.zshrc
放在主文件夹里。
您可能已经知道如何从操作系统提供的任何启动器运行程序。Windows 有开始菜单,MacOS 有 Finder 和 Dock,Ubuntu Linux 有 Dash。当你安装它们时,程序会把它们自己添加到这些启动器中。您也可以在文件资源管理器应用(如 Windows 上的文件资源管理器、MacOS 上的 Finder 和 Ubuntu Linux 上的文件)中双击程序图标来运行它们。
但是这些方法并不适用于你的 Python 程序。经常,双击一个.py
文件将在编辑器或 IDE 中打开 Python 程序,而不是运行它。如果你尝试直接运行 Python,你只需打开 Python 交互式 shell。运行 Python 程序最常见的方式是在 IDE 中打开它,然后单击“运行”菜单选项或在命令行中执行它。如果您只是想启动一个 Python 程序,这两种方法都很乏味。
相反,您可以设置您的 Python 程序,以便从操作系统的启动程序中轻松运行它们,就像您安装的其他应用一样。以下部分详细介绍了如何针对您的特定操作系统执行此操作。
在 Windows 上,您可以通过其他几种方式运行 Python 程序。不用打开终端窗口,可以按win+R
打开运行对话框,输入py C:\path\to\yourScript.py
,如图图 2-7 所示。py.exe
程序安装在C:\Windows\py.exe
,它已经在PATH
环境变量中,并且.exe
文件扩展名是可选的。
图 2-7:Windows 上的运行对话框
不过,这种方法要求您输入脚本的完整路径。此外,当程序结束时,显示程序输出的终端窗口将自动关闭,您可能会错过一些输出。
您可以通过创建一个批处理脚本来解决这些问题,它是一个带有.bat
文件扩展名的小文本文件,可以一次运行多个终端命令,很像 MacOS 和 Linux 中的 Shell 脚本。您可以使用文本编辑器(如记事本)来创建这些文件。创建一个包含以下两行的新文本文件:
@py.exe `C:\path\to\yourScript.py` %*
@pause
用程序的绝对路径替换这个路径,用.bat
文件扩展名保存这个文件(例如yourScript.bat
)。每个命令开头的@
符号防止它显示在终端窗口中,并且%*
将在批处理文件名后输入的任何命令行参数转发给 Python 脚本。Python 脚本依次读取sys.argv
列表中的命令行参数。这个批处理文件将使您不必在每次运行 Python 程序时都键入它的完整绝对路径。@pause
命令将Press any key to continue...
添加到 Python 脚本的末尾,以防止程序的窗口消失得太快。
我建议您放置您的所有批次和.py
文件放在一个已经存在于PATH
环境变量中的文件夹中,比如您在C:\Users\<USERNAME>
的主文件夹。设置好批处理文件后,只需按下win+R
,输入批处理文件的名称(.bat
文件扩展名可选),按回车,就可以运行 Python 脚本。
在 MacOS 上,您可以通过使用.command
扩展名创建一个文本文件,来创建一个 Shell 脚本来运行 Python 脚本。在文本编辑器(如“文本编辑”)中创建一个,并添加以下内容:
#!/usr/bin/env bash
python3 `/path/to/yourScript.py`
将此文件存储在您的个人文件夹中。在终端窗口中,通过运行chmod u+x yourScript.command
使这个 Shell 脚本可执行。现在,您应该能够点击 Spotlight 图标(或按下Cmd+Space
)并输入您的 Shell 脚本的名称来运行它。Shell 脚本将依次运行您的 Python 脚本。
在 Ubuntu Linux 上没有像在 Windows 和 MacOS 上那样快速运行 Python 脚本的方法,尽管你可以缩短一些相关步骤。首先,确定你的.py
文件位于您的个人文件夹中。其次,把这一行添加为你的.py
文件的第一行:
#!/usr/bin/env python3
这被称为一个 Shebang 行,它告诉 Ubuntu 当你运行这个文件时,你想使用python3
来运行它。第三,通过从终端运行chmod
命令向该文件添加执行权限:
email@protected:~$ chmod u+x yourScript.py
现在,无论何时你想快速运行你的 Python 脚本,你都可以按下Ctrl+Alt+T
来打开一个新的终端窗口。这个终端将被设置到主文件夹,所以你可以简单地输入./yourScript.py
来运行这个脚本。./
是必需的,因为它告诉 Ubuntu yourScript.py
存在于 CWD(本例中是主文件夹)中。
环境配置包括让您的计算机进入可以轻松运行程序的状态所需的所有步骤。它要求您了解一些关于您的计算机如何工作的底层概念,例如文件系统、文件路径、进程、命令行和环境变量。
文件系统是您的计算机组织计算机上所有文件的方式。文件是完整的绝对文件路径或相对于 CWD 的文件路径。您将通过命令行导航文件系统。命令行还有其他几个名称,如终端、Shell 和控制台,但它们都指的是同一个东西:允许您输入命令从而完成基于文本的程序。尽管 Windows 和 MacOS/Linux 的命令行和常用命令的名称略有不同,但它们实际上他们大同小异。
当您输入命令或程序名时,命令行会检查在PATH
环境变量中列出的文件夹的名称。理解这一点对于找出您可能遇到的任何command not found
错误非常重要。向PATH
环境变量添加新文件夹的步骤在 Windows 和 MacOS/Linux 之间也略有不同。
熟悉命令行需要时间,因为有太多的命令和命令行参数需要学习。如果你花了很多时间在网上搜索帮助,不要气馁,大家都是这样过来的。