Python on Windows FAQ

How do I run a Python program under Windows?

这不一定是一个直接的问题。如果你已经熟悉从Windows命令行运行程序,那么一切都会很明显;否则,您可能需要更多的指导。

除非你使用某种集成的开发环境,否则你会将键入 Windows命令到不同的称为“DOS窗口”或“命令提示符窗口”。通常,您可以从“开始”菜单创建此类窗口;在Windows 7下,菜单选项为开始‣程序‣附件‣命令提示符你应该能够识别什么时候开始这样的窗口,因为你会看到一个Windows“命令提示符”,通常看起来像这样:

C:\>

这个字母可能不同,后面可能还有其他东西,所以你可能很容易看到:

D:\YourName\Projects\Python>

这取决于你的计算机如何设置和你最近做了什么。一旦你已经开始这样的窗口,你正在运行Python程序的路上。

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

首先,您需要确保您的命令窗口识别单词“python”作为启动解释器的指令。如果你打开了一个命令窗口,你应该尝试输入命令python并击中返回。

C:\Users\YourName> python

然后你应该看到类似:

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

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

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

许多人使用交互模式作为方便但高度可编程的计算器。When you want to end your interactive Python session, hold the Ctrl key down while you enter a Z, then hit the “Enter” key to get back to your Windows command prompt.

您还可能会发现您有一个开始菜单项,如开始‣程序‣Python 3.3‣Python(命令行),导致您看到>>>如果是,则在输入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:\Python33否则,您将被减少搜索整个磁盘...使用工具‣查找或按搜索按钮,并找到“python.exe”。假设您发现Python安装在C:\Python33目录(在编写本文时为默认目录)中,您应该确保输入命令

c:\Python33\python

启动解释器如上(并且不要忘记你需要一个“Ctrl-Z”和“Enter”)。一旦你验证目录,你可以将它添加到系统路径,以便更容易启动Python只需运行python命令。这是目前在CPython 3.3的安装程序中的一个选项。

有关环境变量的详细信息,请参阅Using Python on Windows页面。

How do I make Python scripts executable?

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

Why does Python sometimes take so long to start?

通常Python在Windows上启动非常快,但偶尔有bug的报告,Python突然开始花费很长时间启动。这使得更加令人困惑,因为Python将工作正常在其他Windows系统,似乎被配置相同。

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

How do I make an executable from a Python script?

有关可以从Python代码创建控制台和GUI可执行文件的distutils扩展,请参见http://cx-freeze.sourceforge.net/py2exe是构建基于Python 2.x的可执行文件的最流行的扩展,它不支持Python 3,但是一个正在开发中的版本。

Is a *.pyd file the same as a DLL?

是的,.pyd文件是dll的,但有一些差异。如果你有一个名为foo.pyd的DLL,那么它必须有一个函数PyInit_foo()然后你可以编写Python“import foo”,Python将搜索foo.pyd(以及foo.py,foo.pyc),如果找到它,将尝试调用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中,链接在可用函数列表中定义。

How can I embed Python into a Windows application?

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

  1. do _not_直接构建Python到你的.exe文件。在Windows上,Python必须是一个DLL来处理本身是DLL的导入模块。(这是第一个关键的无证事实。)而应链接到python NN .dll;它通常安装在C:\Windows\System中。NN是Python版本,对于Python 3.3是一个数字,例如“33”。

    你可以通过两种不同的方式链接到Python。加载时链接意味着链接python NN .lib,而运行时链接意味着链接 python NN .dll(General note: pythonNN.lib is the so-called “import lib” corresponding to pythonNN.dll. 它只定义了链接器的符号。)

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

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

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

  3. SWIG将创建一个init函数(一个C函数),其名称取决于扩展模块的名称。例如,如果模块的名称是leo,init函数将被称为initleo()。如果你使用SWIG shadow类,那么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 *参数不会在多编译器环境中工作,因为每个编译器的结构FILE的概念将是不同的。从实现的角度来看,这些都是非常低级的功能。

    问题2:当生成包装函数到void函数时,SWIG生成以下代码:

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

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

    return Py_BuildValue("");
    

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

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

How do I keep editors from inserting tabs into my Python source?

FAQ不建议使用制表符,而且Python风格指南 PEP 8建议为分布式Python代码使用4个空格;这也是Emacs的python-mode默认。

在任何编辑器下,混合制表符和空格是一个坏主意。MSVC在这方面没有区别,并且容易配置为使用空格:采取工具‣选项‣标签,对于文件类型“默认”设置“标签大小”和“缩进大小”并选择“插入空格”单选按钮。

如果您怀疑混合制表符和空格在前导空格中产生问题,请使用-t开关运行Python,或者运行Tools/Scripts/tabnanny.py以检查目录树批处理模式。

How do I check for a keypress without blocking?

使用msvcrt模块。这是一个标准的Windows专用扩展模块。它定义了一个函数kbhit()检查是否存在键盘命中,而getch()则返回一个字符。

How do I emulate os.kill() in Windows?

在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+CCtrl+Break到设计为处理这些信号的控制台子进程。有关详细信息,请参阅os.kill()

How do I extract the downloaded documentation on Windows?

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

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