Windows 上的 Python 常见问题解答

Contents

如何在 Windows 下运行 Python 程序?

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

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

C:\>

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

D:\YourName\Projects\Python>

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

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

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

C:\Users\YourName> py

然后,您应该看到类似以下内容:

Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 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 时调用exit()函数或按住 Ctrl 键,然后按“ Enter”键返回 Windows 命令提示符。

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

现在我们知道py命令已被识别,您可以为其提供 Python 脚本。您必须提供 Python 脚本的绝对路径或相对路径。假设您的 Python 脚本位于您的桌面上,名为hello.py,并且您的主目录中很好地打开了命令提示符,因此您会看到类似以下内容的内容:

C:\Users\YourName>

因此,现在您将要求py命令,pass Importingpy后跟脚本路径将脚本提供给 Python:

C:\Users\YourName> py Desktop\hello.py
hello

如何使 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 扩展的信息,请参见cx_Freeze,该扩展程序允许您从 Python 代码创建控制台和 GUI 可执行文件。 py2exe是构建基于 Python 2.x 的可执行文件的最流行的扩展,目前尚不支持 Python 3,但正在开发中。

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

是的,.pyd 文件是 dll 的文件,但是有一些区别。如果您有一个名为foo.pyd的 DLL,则它必须具有一个函数PyInit_foo()。然后,您可以编写 Python“ import foo”,Python 将搜索 foo.pyd(以及 foo.py,foo.pyc),如果找到,将try调用PyInit_foo()对其进行初始化。您不要将.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 3.3,数字是“ 33”。

您可以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,然后选择“插入空格”单选按钮。

如果混合使用制表符和空格导致前导空格出现问题,则 Python 会引发IndentationErrorTabError。您也可以运行tabnanny模块以批处理方式检查目录树。

如何检查按键是否畅通无阻?

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