Windows 上的 Python 常见问题解答

Contents

如何在 Windows 下运行 Python 程序?

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

除非您使用某种集成开发环境,否则您finally会将 Windows 命令键入到各种被称为“ DOS 窗口”或“命令提示符窗口”的窗口中。通常,您可以从“开始”菜单创建这样的窗口。在 Windows 7 下,菜单选择为开始‣程序‣附件‣命令提示符。您应该能够识别出何时启动了这样的窗口,因为您将看到 Windows“命令提示符”,通常如下所示:

C:\>

该字母可能有所不同,并且其后可能还有其他内容,因此您可能同样容易看到以下内容:

D:\YourName\Projects\Python>

取决于计算机的设置方式以及您最近对计算机所做的其他操作。一旦启动了这样的窗口,就可以很好地运行 Python 程序。

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

首先,您需要确保命令窗口将单词“ python”识别为启动解释器的指令。如果您打开了命令窗口,则应try Importing 命令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.
>>>

您已在“交互模式”下启动了解释器。这意味着您可以交互地 ImportingPython 语句或表达式,并在 await 时执行或评估它们。这是 Python 最强大的Function之一。pass Importing 一些您选择的表达式并查看结果来进行检查:

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

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

您可能还会发现,您有一个开始菜单项,例如开始 Start 程序‣Python 2.7‣Python(命令行),导致您在新窗口中看到>>>提示符。如果是这样,则在您 ImportingCtrl-Z 字符后该窗口将消失;否则,该窗口将消失。 Windows 在窗口中运行单个“ python”命令,并在终止解释器时将其关闭。

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

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

or:

Bad command or filename

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

您应该安排在开始时将 Python 的安装目录添加到每个命令窗口的 PATH 中。如果您刚刚安装了 Python,则该命令

dir C:\py*

可能会告诉您它的安装位置;通常的位置是C:\Python27。否则,您将只能搜索整个磁盘...使用工具‣查找或单击搜索按钮,然后查找“ python.exe”。假设您发现 Python 安装在C:\Python27目录中(在编写本文时为默认设置),则应确保 Importing 以下命令

c:\Python27\python

按上述方式启动解释器(别忘了,您需要使用“ Ctrl-Z”和“ Enter”键才能退出)。验证目录后,您可以将其添加到系统路径中,从而只需运行python命令即可更轻松地启动 Python。从 CPython 2.7 开始,当前是安装程序中的一个选项。

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

如何使 Python 脚本可执行?

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

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

通常,Python 在 Windows 上的启动速度非常快,但偶尔也有错误报告称 Python 突然开始需要很长时间才能启动。这使您更加困惑,因为 Python 在其他配置相同的 Windows 系统上可以正常工作。

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

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

有关 distutils 扩展的信息,请参见http://www.py2exe.org/,该扩展程序允许您从 Python 代码创建控制台和 GUI 可执行文件。

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

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

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

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

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

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

您可以pass两种不同的方式链接到 Python。加载时链接表示针对pythonNN.lib,而运行时链接表示针对pythonNN.dll。 (一般说明:pythonNN.lib是对应于pythonNN.dll的所谓“ import lib”.它仅定义链接器的符号.)

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

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

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

  • SWIG 将创建一个初始化函数(C 函数),该函数的名称取决于扩展模块的名称。例如,如果模块的名称是 leo,则 init 函数将称为 initleo()。如果您应该使用 SWIGshade 类,则 init 函数将称为 initleoc()。这将初始化 shade 类使用的几乎隐藏的帮助程序类。

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

  • 简而言之,您可以使用以下代码pass扩展模块初始化 Python 解释器。
#include "python.h"
...
Py_Initialize();  // Initialize Python.
initmyAppc();  // Initialize (import) the helper class.
PyRun_SimpleString("import myApp");  // Import the shadow class.
  • 如果使用 MSVC 以外的编译器(用于构建 pythonNN.dll 的编译器),Python 的 C API 会出现两个问题。

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

问题 2:在生成包装器以使函数无效时,SWIG 生成以下代码:

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

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

return Py_BuildValue("");

可能可以使用 SWIG 的%typemap命令自动进行更改,尽管我无法使其生效(我是完整的 SWIG 新手)。

  • 在 Windows 应用程序内部使用 Python Shell 脚本构建 Python 解释器窗口不是一个好主意。finally的窗口将独立于您应用程序的窗口系统。相反,您(或 wxPythonWindow 类)应创建一个“本机”解释器窗口。将该窗口连接到 Python 解释器很容易。您可以将 Python 的 I/O 重定向到支持读取和写入的_any 对象,因此您所需要的就是一个包含 read()和 write()方法的 Python 对象(在扩展模块中定义)。

如何防止编辑者将制表符插入我的 Python 源代码?

FAQ 不建议使用选项卡,Python 样式指南 PEP 8建议为分布式 Python 代码提供 4 个空格。这也是 Emacs python 模式的默认设置。

在任何编辑器下,混用制表符和空格都不是一个好主意。 MSVC 在这方面没有什么不同,并且可以很容易地配置为使用空格:选取“工具”‣“选项”‣“选项卡”,对于文件类型“默认”,将“标签大小”和“缩进大小”设置为 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 中,与上述Function相似,实现了os.kill(),其附加Function是能够将 Ctrl C 和 Ctrl Break 发送到旨在处理这些 signal 的控制台子进程。有关更多详细信息,请参见os.kill()

如何在 Windows 上解压缩下载的文档?

有时,当您使用 Web 浏览器将文档包下载到 Windows 计算机时,所保存文件的文件 extensions finally是.EXE。这是个错误;extensions 应为.TGZ。

只需将下载的文件重命名为.TGZextensions,WinZip 就可以处理它。 (如果您的 WinZip 副本不存在,请从https://www.winzip.com获得更新的副本。)