Windows上的python常见问题解答

如何在Windows下运行python程序?

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

除非使用某种集成的开发环境,否则最终会 打字 Windows命令进入各种各样的“DOS窗口”或“命令提示窗口”。通常,您可以通过搜索栏创建这样的窗口 cmd . 您应该能够识别什么时候启动了这样一个窗口,因为您将看到一个窗口“命令提示”,它通常如下所示:

C:\>

这封信可能不一样,后面可能还有其他东西,所以你可能也很容易看到类似的东西:

D:\YourName\Projects\Python>

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

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

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

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

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

许多人使用交互模式作为一个方便但高度可编程的计算器。当您想要结束交互式Python会话时,请调用 exit() 功能或保持 Ctrl 当您输入 Z ,然后按“:kbd:enter”键返回Windows命令提示。

您还可能会发现您有一个开始菜单项,例如 Start ‣ Programs ‣ Python 3.x ‣ Python (command line) 结果你看到了 >>> 在新窗口中提示。如果是这样,在您调用 exit() 函数或输入 Ctrl-Z 字符;Windows在窗口中运行单个“python”命令,并在终止解释器时将其关闭。

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

C:\Users\YourName>

所以现在你要问 py 命令通过键入 py 然后是脚本路径:

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

如何使python脚本可执行?

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

为什么Python有时要花这么长时间才能开始?

通常,Python在Windows上启动很快,但偶尔会有bug报告说,Python突然开始启动需要很长时间。这让人更加困惑,因为Python可以在其他Windows系统上正常工作,而这些系统的配置似乎完全相同。

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

如何从Python脚本生成可执行文件?

看见 cx_Freeze 用于允许您从Python代码创建控制台和GUI可执行文件的distutils扩展。 py2exe 是构建基于Python2.x的可执行文件的最流行的扩展,它目前还不支持Python3,但是一个支持Python3的版本正在开发中。

是一个 *.pyd 文件是否与dll相同?

是的,.pyd文件是dll文件,但有一些区别。如果您有一个名为 foo.pyd ,那么它必须有一个函数 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 . 在dll中,链接在源代码中声明为 __declspec(dllexport) . 在.pyd中,链接是在可用函数列表中定义的。

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

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

  1. 做 _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 . (一般注释: python{NN}.lib 所谓的“导入库”是否与 python{NN}.dll . 它只定义链接器的符号。)

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

    Borland注:转换 python{NN}.lib 先使用cof2omf.exe格式化为omf。

  2. 如果您使用swig,那么很容易创建一个python“扩展模块”,使应用程序的数据和方法对python可用。斯威格会为你处理所有棘手的细节。结果是您链接的C代码 into 您的.exe文件!!)你做 _not_ 必须创建一个dll文件,这也简化了链接。

  3. swig将创建一个init函数(C函数),其名称取决于扩展模块的名称。例如,如果模块名为leo,则init函数将被称为init leo()。如果像应该的那样使用swig shadow类,init函数将被调用initleoc()。这将初始化阴影类使用的大部分隐藏的帮助程序类。

    之所以可以将步骤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*参数的所谓“非常高级”函数在多编译器环境中不起作用,因为每个编译器对结构文件的概念都是不同的。从实现的角度来看,这些 _low_ 级别功能。

    问题2:swig在生成封装器以使函数无效时生成以下代码:

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

    唉,py-none是一个宏,它扩展为对pythonnn.dll内部名为“py-py-nonestruct”的复杂数据结构的引用。同样,此代码将在多编译器环境中失败。将此类代码替换为:

    return Py_BuildValue("");
    

    可能可以使用swig's %typemap 命令自动进行更改,尽管我还不能让它工作(我是一个完全的Swig新手)。

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

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

常见问题解答不建议使用选项卡和《Python样式指南》, PEP 8 ,为分布式python代码推荐4个空格;这也是emacs python模式的默认值。

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

Python 饲养 IndentationErrorTabError 如果混合的制表符和空格导致前导空格出现问题。您也可以运行 tabnanny 模块以批处理模式检查目录树。

如何检查没有阻塞的按键?

使用 msvcrt 模块。这是特定于Windows的标准扩展模块。它定义了一个函数 kbhit() 它检查是否存在键盘点击,并且 getch() 它只得到一个字符,而不与之相呼应。