第20章-系统模块

这个 sys 模块提供系统特定的参数和功能。我们将把研究范围缩小到以下几个方面:

  • sys.argv

  • sys.executable

  • sys.exit

  • sys.modules

  • sys.path

  • sys.platform

  • sys.stdin/stdout/stderr


sys.argv

价值 sys.argv 是传递给python脚本的命令行参数的python列表。第一个论点, [argv[0]] 是Python脚本本身的名称。根据运行的平台的不同,第一个参数可能包含脚本的完整路径或文件名。您应该研究文档以了解更多详细信息。

让我们尝试几个例子来熟悉这个小工具:

>>> import sys
>>> sys.argv
['']

如果您在解释器中运行这个,您将收到一个带有空字符串的列表。让我们创建一个名为“sysargv.py”的文件,其中包含以下内容:

# sysargv.py
import sys

print(sys.argv)

现在在 IDLE 状态下运行代码。您应该看到它用一个包含脚本路径的元素打印出一个列表。让我们尝试给脚本传递一些参数。打开终端/控制台屏幕,将目录(使用“cd”命令)更改为脚本所在的位置。然后这样运行:

_images/sys_argv.jpg

您会注意到它向屏幕输出以下内容:

['sysargv.py', '-v', 'somefile.py']

第一个参数是我们编写的脚本的名称。列表中接下来的两个参数是我们在命令行上传递给脚本的参数。

sys.executable

价值 sys.executable 是到Python解释器的绝对路径。当您使用其他人的机器,并且需要知道在哪里安装了python时,这非常有用。在某些系统上,此命令将失败,并返回空字符串或不返回。以下是如何使用它:

>>> import sys
>>> sys.executable
'C:\\Python27\\pythonw.exe'

sys.exit

这个 系统退出() 函数允许开发人员退出Python。这个 exit 函数接受一个可选参数,通常是一个整数,它给出一个退出状态。零被视为“成功终止”。一定要检查您的操作系统对于其退出状态是否有任何特殊意义,以便您可以在自己的应用程序中遵循它们。注意,当你打电话的时候 exit ,它将提高 SystemExit 异常,允许清理函数在 finally 条款 try / except 阻碍。

让我们来看看如何称之为:

>>> import sys
>>> sys.exit(0)

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    sys.exit(0)
SystemExit: 0

当您在 IDLE 状态下运行此代码时,您将看到系统退出错误。让我们创建几个脚本来测试这一点。首先,您需要创建一个主脚本,一个调用另一个Python脚本的程序。让我们把它命名为“call-exit.py”。输入以下代码:

# call_exit.py
import subprocess

code = subprocess.call(["python.exe", "exit.py"])
print(code)

现在创建另一个名为“exit.py”的python脚本,并将其保存在同一个文件夹中。输入以下代码:

import sys

sys.exit(0)

现在让我们尝试运行此代码:

_images/call_exit.jpg

在上面的屏幕截图中,您可以看到我们编写的退出脚本返回了零,因此它成功运行。您还学习了如何从python内部调用另一个python脚本!

sys.path

系统模块 path 值是指定模块搜索路径的字符串列表。基本上,这告诉Python在尝试导入模块时要查找的位置。根据python文档, sys.path 从名为pythonpath的环境变量以及依赖于安装的默认值初始化。让我们试一试:

>>> import sys
>>> print(sys.path)
['',
'C:\\Python27\\Lib\\idlelib',
'C:\\Python27\\lib\\site-packages\\setuptools-0.9.5-py2.7.egg',
'C:\\Python27\\lib\\site-packages\\pip-1.3.1-py2.7.egg',
'C:\\Python27\\lib\\site-packages\\sphinx-1.2b3-py2.7.egg',
'C:\\Python27\\lib\\site-packages\\docutils-0.11-py2.7.egg',
'C:\\Python27\\lib\\site-packages\\pygments-1.6-py2.7.egg',
'C:\\Windows\\system32\\python27.zip', '
C:\\Python27\\DLLs',
'C:\\Python27\\lib',
'C:\\Python27\\lib\\plat-win',
'C:\\Python27\\lib\\lib-tk',
'C:\\Python27',
'C:\\Python27\\lib\\site-packages',
'C:\\Python27\\lib\\site-packages\\PIL',
'C:\\Python27\\lib\\site-packages\\wx-2.9.4-msw']

这对于调试为什么不导入模块非常有用。还可以修改路径。因为它是一个列表,所以我们可以添加或删除其中的路径。以下是添加路径的方法:

>>> sys.path.append("/path/to/my/module")

我将把删除路径作为练习留给读者。

sys.platform

这个 sys.platform 值是平台标识符。您可以使用它将特定于平台的模块附加到 sys.path ,根据平台导入不同的模块或运行不同的代码段。让我们看看:

>>> import sys
>>> sys.platform
'win32'

这告诉我们python正在Windows机器上运行。下面是我们如何使用此信息的示例:

>>> os = sys.platform
>>> if os == "win32":
        # use Window-related code here
        import _winreg
    elif os.startswith('linux'):
        # do something Linux specific
        import subprocess
        subprocess.Popen(["ls, -l"])

上面的代码显示了我们如何检查是否在使用特定的操作系统。如果我们在Windows上,我们将使用一个名为 _winreg .如果我们在Linux上,我们可能会执行 ls 获取我们所在目录信息的命令。

系统stdin/stdout/stderr

这个 斯坦丁标准输出标准错误 映射到分别对应于解释器的标准输入、输出和错误流的文件对象。 斯坦丁 用于为解释器提供的所有输入,脚本除外,而 标准输出 用于输出 打印表达 声明。我提到这一点的主要原因是,您有时需要将stdout或stderr或两者都重定向到一个文件,例如日志或您创建的自定义GUI中的某种显示。您也可以重定向stdin,但我很少看到这样做。

总结

sys 模块。一定要在第27.1节的python文档中查找它。你在这一章学到了很多东西。现在您知道了如何退出Python程序、如何获取平台信息、如何处理命令行上传递的参数等等。在下一章中,我们将学习Python线程!