第 3 章 脚本执行上下文脚本执行上下文
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
"我想和你争论一下"
Python 脚本并不是在真空中运行的(尽管你可能听说过)。根据平台和启动程序的不同,Python 程序在启动时可能会有操作系统自动传递给程序的各种外围上下文信息。例如,脚本可以访问以下各种系统级输入和接口:
- 当前工作目录
os.getcwd使 可以访问脚本启动时所在的目录,许多文件工具都会隐式地使用它的值。- 命令行参数
sys.argv让 可以访问命令行上键入的单词,这些单词用于启动程序并作为脚本输入。- 外壳变量
os.environ为 提供了一个接口,用于访问在外层 shell(或父程序)中分配并传入脚本的名称。- 标准流
sys.stdin,stdout, 和stderr输出作为命令行 shell 工具核心的三个输入/输出流,脚本可以利用print选项、第 2 章介绍的os.popen调用和subprocess模块、io.StringIO类等。
这些工具可以作为脚本的输入、配置参数等。在本章中,我们将探索所有这四种上下文的工具--包括它们的 Python 界面和典型作用。
当前工作目录
当前工作目录(CWD)的概念在某些脚本的执行中是一个关键概念:除非脚本处理的文件名有绝对目录路径,否则它总是脚本处理文件的隐含位置。如前所述,os.getcwd 允许脚本明确获取 CWD 名称,而 os.chdir 允许脚本移动到新的 CWD。
不过请记住,没有完整路径名的文件名映射到的是 CWD,与PYTHONPATH 设置无关。从技术上讲,脚本总是从 CWD 启动,而不是从包含脚本文件的目录启动。相反,导入总是首先搜索包含脚本的目录,而不是 CWD(除非脚本恰好也位于 CWD 中)。由于这种区别很微妙,往往会绊倒初学者,让我们来详细探讨一下。
CWD、文件和导入路径
当您通过键入 shell 命令行运行Python 脚本时,例如python dir1\dir2\file.py ,CWD 是您键入此命令时所在的目录,而不是dir1\dir2 。另一方面,Python 会自动将脚本主目录的标识添加到模块搜索路径的前面,这样file.py无论从哪里运行,都可以导入dir1\dir2中的其他文件。为了说明这一点,让我们写一个简单的脚本来回调它的 CWD 和模块搜索路径:
C:\...\PP4E\System> type whereami.py
import os, sys
print('my os.getcwd =>', os.getcwd()) # show my cwd execution dir
print('my sys.path =>', sys.path[:6]) # show first 6 import paths
input() # wait for keypress if clicked现在,在该脚本所在的目录中运行该脚本,就会如预期那样设置 CWD,并将其添加到模块导入搜索路径的前端。我们在前面介绍过 sys.path 模块搜索路径;在交互式工作时,它的第一个条目也可能是指定 CWD 的空字符串,为了便于显示,这里的大部分 CWD 都被截断为"...":
C:\...\PP4E\System>set PYTHONPATH=C:\PP4thEd\ExamplesC:\...\PP4E\System>python whereami.pymy os.getcwd => C:\...\PP4E\System ...