Windows 上的 Python 常见问题解答 — Python 文档

来自菜鸟教程
Python/docs/2.7/faq/windows
跳转至:导航、​搜索

Windows 上的 Python 常见问题解答

如何在 Windows 下运行 Python 程序?

这不一定是一个直截了当的问题。 如果您已经熟悉从 Windows 命令行运行程序,那么一切都将显而易见; 否则,您可能需要更多指导。

除非您使用某种集成开发环境,否则您最终将 Windows 命令输入到各种称为“DOS 窗口”或“命令提示符窗口”的地方。 通常,您可以从“开始”菜单创建这样一个窗口; 在 Windows 7 下,菜单选择是 Start ‣ Programs ‣ Accessories ‣ Command Prompt。 您应该能够识别何时启动了这样的窗口,因为您会看到一个 Windows“命令提示符”,通常如下所示:

C:\>

这封信可能不同,后面可能还有其他内容,因此您可能很容易看到以下内容:

D:\YourName\Projects\Python>

取决于您的计算机是如何设置的以及您最近对它做了什么。 一旦您启动了这样一个窗口,您就可以很好地运行 Python 程序了。

您需要意识到您的 Python 脚本必须由另一个名为 Python 解释器 的程序处理。 解释器读取您的脚本,将其编译为字节码,然后执行字节码以运行您的程序。 那么,你如何安排解释器来处理你的 Python?

首先,您需要确保您的命令窗口将单词“python”识别为启动解释器的指令。 如果您打开了命令窗口,您应该尝试输入命令 python 并按回车键。:

C:\Users\YourName> python

然后你应该看到类似的东西:

Python 2.7.3 (default, Apr 10 2012, 22.71:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

您已经在“交互模式”下启动了解释器。 这意味着您可以交互式地输入 Python 语句或表达式,并在等待时执行或评估它们。 这是 Python 最强大的特性之一。 通过输入您选择的几个表达式并查看结果来检查它:

>>> print "Hello"
Hello
>>> "Hello" * 3
'HelloHelloHello'

许多人将交互模式用作方便但高度可编程的计算器。 如果您想结束交互式 Python 会话,请在输入 Z 的同时按住 Ctrl 键,然后按“Enter”键返回您的 Windows 命令提示符。

您可能还会发现您有一个开始菜单条目,例如 Start ‣ Programs ‣ Python 2.7 ‣ Python (command line) 导致您在新窗口中看到 >>> 提示。 如果是这样,输入Ctrl-Z字符后窗口会消失; Windows 正在窗口中运行单个“python”命令,并在您终止解释器时关闭它。

如果 python 命令不是显示解释器提示 >>>,而是显示如下消息:

'python' is not recognized as an internal or external command, operable program or batch file.

或者:

Bad command or filename

那么你需要确保你的计算机知道在哪里可以找到 Python 解释器。 为此,您必须修改名为 PATH 的设置,它是 Windows 将在其中查找程序的目录列表。

您应该安排将 Python 的安装目录添加到每个命令窗口启动时的 PATH 中。 如果您最近安装了 Python,那么命令

dir C:\py*

可能会告诉你它的安装位置; 通常的位置类似于 C:\Python27。 否则,您将只能搜索整个磁盘……使用 Tools ‣ Find 或点击 Search 按钮并查找“python.exe”。 假设你发现 Python 安装在 C:\Python27 目录下(写作时的默认值),你应该确保输入命令

c:\Python27\python

启动解释器如上(不要忘记你需要一个“Ctrl-Z”和一个“Enter”来退出它)。 验证目录后,您可以将其添加到系统路径中,只需运行 python 命令即可更轻松地启动 Python。 从 CPython 2.7 开始,这是当前安装程序中的一个选项。

有关环境变量的更多信息,请参见 在 Windows 上使用 Python 页面。


如何使 Python 脚本可执行?

在 Windows 上,标准 Python 安装程序已经将 .py 扩展名与文件类型 (Python.File) 相关联,并为该文件类型提供了一个运行解释器 (D:\Program Files\Python\python.exe "%1" %*) 的打开命令。 这足以使脚本从命令提示符可执行为“foo.py”。 如果您希望能够通过简单地键入不带扩展名的“foo”来执行脚本,则需要将 .py 添加到 PATHEXT 环境变量中。


为什么 Python 有时需要很长时间才能启动?

通常 Python 在 Windows 上启动非常快,但偶尔会有 bug 报告说 Python 突然开始需要很长时间才能启动。 这更令人费解,因为 Python 在其他配置相同的 Windows 系统上也能正常工作。

该问题可能是由问题机器上的病毒检查软件配置错误引起的。 已知某些病毒扫描程序在将扫描程序配置为监视来自文件系统的所有读取时会引入两个数量级的启动开销。 尝试检查系统上病毒扫描软件的配置,以确保它们的配置确实相同。 当配置为扫描所有文件系统读取活动时,McAfee 是一个特殊的罪犯。


如何从 Python 脚本制作可执行文件?

请参阅 http://www.py2exe.org/ 以获取允许您从 Python 代码创建控制台和 GUI 可执行文件的 distutils 扩展。


*.pyd 文件是否与 DLL 相同?

是的,.pyd 文件是 dll,但有一些区别。 如果你有一个名为 foo.pyd 的 DLL,那么它必须有一个函数 initfoo()。 然后,您可以编写 Python “import foo”,Python 将搜索 foo.pyd(以及 foo.py、foo.pyc),如果找到,将尝试调用 initfoo() 对其进行初始化。 您不要将 .exe 与 foo.lib 链接,因为这会导致 Windows 要求存在 DLL。

请注意,foo.pyd 的搜索路径是 PYTHONPATH,与 Windows 用于搜索 foo.dll 的路径不同。 此外,运行您的程序不需要 foo.pyd,而如果您将程序与 dll 链接,则需要 dll。 当然,如果要说import foo,则需要foo.pyd。 在 DLL 中,链接在源代码中用 __declspec(dllexport) 声明。 在 .pyd 中,链接在可用函数列表中定义。


如何将 Python 嵌入到 Windows 应用程序中?

在 Windows 应用程序中嵌入 Python 解释器可以总结如下:

  1. 不要_不要_直接将 Python 构建到您的 .exe 文件中。 在 Windows 上,Python 必须是一个 DLL 来处理导入模块本身就是 DLL 的。 (这是第一个未记录的关键事实。)相反,链接到 pythonNN.dll; 它通常安装在 C:\Windows\System 中。 NN 是 Python 版本,对于 Python 2.7 是诸如“27”之类的数字。

    您可以通过两种不同的方式链接到 Python。 加载时链接意味着链接到 pythonNN.lib,而运行时链接意味着链接到 pythonNN.dll。 (一般注意:pythonNN.lib是所谓的“import lib”对应于pythonNN.dll。 它只是为链接器定义符号。)

    运行时链接大大简化了链接选项; 一切都发生在运行时。 您的代码必须使用 Windows LoadLibraryEx() 例程加载 pythonNN.dll。 代码还必须使用通过 Windows GetProcAddress() 例程获得的指针,使用 pythonNN.dll(即 Python 的 C API)中的访问例程和数据。 宏可以使使用这些指针对调用 Python 的 C API 中的例程的任何 C 代码透明。

    Borland 注意:首先使用 Coff2Omf.exe 将 pythonNN.lib 转换为 OMF 格式。

  2. 如果您使用 SWIG,很容易创建一个 Python“扩展模块”,使应用程序的数据和方法可用于 Python。 SWIG 将为您处理几乎所有脏乱的细节。 结果是您将 链接到 .exe 文件的 C 代码(!)您_不必_创建一个 DLL 文件,这也简化了链接。

  3. SWIG 将创建一个 init 函数(一个 C 函数),其名称取决于扩展模块的名称。 例如,如果模块的名称是 leo,则 init 函数将调用 initleo()。 如果您使用 SWIG 影子类,那么 init 函数将被称为 initleoc()。 这将初始化一个由 shadow 类使用的主要隐藏的帮助类。

    您可以将第 2 步中的 C 代码链接到您的 .exe 文件的原因是调用初始化函数相当于将模块导入 Python! (这是第二个未记录的关键事实。)

  4. 简而言之,您可以使用以下代码用您的扩展模块初始化 Python 解释器。

    #include "python.h"
    ...
    Py_Initialize();  // Initialize Python.
    initmyAppc();  // Initialize (import) the helper class.
    PyRun_SimpleString("import myApp");  // Import the shadow class.
  5. Python 的 C API 有两个问题,如果您使用 MSVC 以外的编译器(用于构建 pythonNN.dll 的编译器),这两个问题就会变得很明显。

    问题 1:采用 FILE * 参数的所谓“非常高级”函数在多编译器环境中不起作用,因为每个编译器对 struct FILE 的概念是不同的。 从实现的角度来看,这些是非常低级的功能。

    问题 2:SWIG 在为 void 函数生成包装器时生成以下代码:

    Py_INCREF(Py_None);
    _resultobj = Py_None;
    return _resultobj;

    唉,Py_None 是一个宏,它扩展为对 pythonNN.dll 中名为 _Py_NoneStruct 的复杂数据结构的引用。 同样,此代码将在多编译器环境中失败。 将此类代码替换为:

    return Py_BuildValue("");

    可以使用 SWIG 的 %typemap 命令自动进行更改,但我无法使其正常工作(我是一个完整的 SWIG 新手)。

  6. 使用 Python shell 脚本从 Windows 应用程序内部建立 Python 解释器窗口不是一个好主意; 生成的窗口将独立于您的应用程序的窗口系统。 相反,您(或 wxPythonWindow 类)应该创建一个“本机”解释器窗口。 将该窗口连接到 Python 解释器很容易。 您可以将 Python 的 i/o 重定向到支持读写的 _any_ 对象,因此您只需要一个包含 read() 和 write() 方法的 Python 对象(在您的扩展模块中定义)。


如何防止编辑器将选项卡插入到我的 Python 源代码中?

FAQ不推荐使用tabs,Python风格指南PEP 8推荐4个空格用于分布式Python代码; 这也是 Emacs python 模式的默认值。

在任何编辑器下,混合制表符和空格都是一个坏主意。 MSVC 在这方面没有什么不同,并且很容易配置为使用空格:取 Tools ‣ Options ‣ Tabs,并将文件类型“默认”设置“制表符大小”和“缩进大小”为 4,然后选择“插入空格”单选按钮。

如果您怀疑混合制表符和空格导致前导空格出现问题,请使用 -t 开关运行 Python 或运行 tabnanny 模块以批处理模式检查目录树。


如何在不阻塞的情况下检查按键?

使用 msvcrt 模块。 这是一个标准的 Windows 特定的扩展模块。 它定义了一个函数 kbhit() 来检查是否存在键盘敲击,以及 getch() 获取一个字符而不回显它。


如何在 Windows 中模拟 os.kill()?

在 Python 2.7 和 3.2 之前,要终止进程,可以使用 ctypes

import ctypes

def kill(pid):
    """kill function for Win32"""
    kernel32 = ctypes.windll.kernel32
    handle = kernel32.OpenProcess(1, 0, pid)
    return (0 != kernel32.TerminateProcess(handle, 0))

在 2.7 和 3.2 中,os.kill() 的实现与上述函数类似,附加功能是可以发送 Ctrl+C 和 Ctrl+Break[ X165X] 到控制台子进程,这些子进程旨在处理这些信号。 有关更多详细信息,请参阅 os.kill()


如何在 Windows 上提取下载的文档?

有时,当您使用 Web 浏览器将文档包下载到 Windows 计算机时,保存文件的文件扩展名最终是 .EXE。 这是个错误; 扩展名应该是 .TGZ。

只需将下载的文件重命名为 .TGZ 扩展名,WinZip 就能处理它。 (如果您的 WinZip 副本没有,请从 https://www.winzip.com 获取更新的副本。)