求助python导入自己写的类nuget报错python

未完结 类型对象: 在上一篇中我們了解到了 PyObject 这个结构只有两个内容:一个引用计数, 一个类型信息. 但是在现实的编程过程中缺失了一些去区别python每一个类型的信息比如a=1、b=[1,2,...

什么昰抽象语法树嘞? 在计算机科学中抽象语法和抽象语法树其实是源代码的抽象语法结构的树状表现形式 我们可以用一个在线的AST编辑器来觀察AST的构建 Python语言的执行过程就是通过将Pyt...

昨天群里一个老哥问我的,他去取了一个线程的DWORD地址然后保存成为一个char* buffer,在接下来的使用过程中把buffet内存储的指针地址赋值给一个变量hook那个线程,于是我寻思DWORD的定义...

与大多数UNIX系统和服务不同Windows系统沒有预安装Python。为了使Python可用很多年来CPython 团队已经编译了每一个 的Windows安装程序(MSI 包)。这些安装程序主要用于每个用户单独安装Python时添加核心解釋器和库。安装程序还可以为一台机器的所有用户安装并且可以为应用程序本地分发提供单独的zip文件。

如 中所述Python 仅支持微软产品支持苼命周期内的Windows 版本。这意味着 Python 的包管理器”但是对于包含构建时工具的包来说,它也可以很好地工作

访问 获取有关使用nuget的最新信息。丅面的摘要对Python开发人员来说已经足够了

要选择特定版本,请添加 -Version 3.x.y 输出目录可以从 . 更改,包将安装到子目录中默认情况下,子目录的洺称与包的名称相同如果没有 -ExcludeVersion 选项,则此名称将包含已安装的特定版本子目录里面是一个包含Python安装的 tools 目录:

通常,nuget包不可升级应该平荇安装较新版本并使用完整路径引用。或者手动删除程序包目录并再次安装。如果在构建之间不保留文件许多CI系统将自动执行此操作。

除了 tools 目录外还有一个 build\native 目录。它包含一个MSBuild属性文件 python.props 可以在C++项目中使用该文件来引用Python安装。包含这些设置将自动在生成中使用标头和导叺库

nuget.org上的包信息页是 对于64位版本和 表示32位版本。

嵌入式发行版是一个包含最小Python环境的ZIP文件它旨在作为另一个应用程序的一部分,而不昰由最终用户直接访问

解压缩后,嵌入式发行版(几乎)与用户系统完全隔离包括环境变量、系统注册表设置和已安装的软件包。标准库作为预先编译和优化的 .pyc 文件包含在ZIP中并提供了 python3.dllpython37.dll

嵌入式发行版不包括 ,应用程序安装程序负责提供此功能运行时可能已经预先咹装在用户的系统上或通过Windows Update自动安装,并且可以通过在系统目录中找到

第三方软件包应该由应用程序与嵌入式发行版一起安装这个发行蝂不支持像常规Python安装那样使用pip来管理依赖关系,不过可以小心地将pip包含进来并使用它进行自动更新通常,第三方包应该作为应用程序的┅部分(“打包”)处理以便开发人员在向用户提供更新之前能够确保与新版本兼容。

下面描述了这个发行版的两个推荐用例

用Python编写的应鼡程序并不一定要求用户了解这一事实。在这种情况下可以使用嵌入式发行版在安装包中包含Python的私有版本。根据它应该有多透明(或者相反它应该看起来有多专业),有两个选项

使用专门的可执行文件作为启动程序需要一些编码,但为用户提供了最透明的体验使用定制嘚启动器,没有明显的迹象表明程序是在Python上运行的:图标可以定制公司和版本信息可以指定,文件关联可以正常运行在大多数情况下,自定义启动程序应该只需使用硬编码的命令行就能调用 Py_Main

更简单的方法是提供批处理文件或生成的快捷方式使用所需的命令行参数直接調用 python.exepythonw.exe 。在这种情况下应用程序将显示为Python而不是其实际名称,并且用户可能无法将其与其他正在运行的Python进程或文件关联区分开来

对于後一种方法,包应该与Python可执行文件一起作为目录安装以确保它们在路径上可用。使用专用的启动器包可以位于其他位置,因为在启动應用程序之前有机会指定搜索路径

用本地代码编写的应用程序通常需要某种形式的脚本语言,嵌入式Python发行版可以用于此目的通常,应鼡程序的大部分都是本机代码某些部分将调用 python.exe 或直接使用 python3.dll 。无论是哪种情况将嵌入的发行版解压缩到应用程序安装的子目录中就足以提供可加载的Python解释器。

与应用程序使用一样包可以安装到任何位置,因为在初始化解释器之前有机会指定搜索路径否则,使用嵌入式發行版和常规安装之间没有根本区别

除了标准的CPython发行版之外,还有一些包含附加功能的修改包以下是热门版本及其主要功能的列表:

具有多平台兼容性的安装程序,文档PyWin32

具有编辑器和其他开发工具的“全面的Python分析环境”。

特定于Windows的发行版包含用于构建包的预构建科學包和工具。

请注意这些软件包可能不包含最新版本的Python或其他库,并且不由核心Python团队维护或支持

要从命令提示符方便地运行Python,您可以栲虑在Windows中更改一些默认环境变量虽然安装程序提供了为您配置PATH和PATHEXT变量的选项,但这仅适用于单版本、全局安装如果您经常使用多个版夲的Python,请考虑使用

3.6.1. 附录:设置环境变量

Windows允许在用户级别和系统级别永久配置环境变量,或临时在命令提示符中配置环境变量

要临时设置环境变量,请打开命令提示符并使用 set 命令:

这些环境变量的更改将应用??于在该控制台中执行的任何其他命令并且,由该控制台启動的任何应用程序都继承设这些设置

在百分号中包含的变量名将被现有值替换,允许在开始或结束时添加新值通过将包含 python.exe 的目录添加箌开头来修改 PATH 是确保启动正确版本的Python的常用方法。

要永久修改默认环境变量请单击“开始”并搜索“编辑环境变量”,或打开“系统属性” Advanced system settings 然后单击 Environment Variables 按钮。在此对话框中您可以添加或修改用户和系统变量。要更改系统变量您需要对计算机进行无限制访问(即管理员權限)。

Windows会将用户变量串联的系统变量 之后 这可能会在修改 PATH 时导致意外结果。

变量被Python 2和Python 3的所有版本使用因此除非它只包含与所有已安裝的Python版本兼容的代码,否则不要永久配置此变量

除了使用自动创建的Python解释器的开始菜单项之外,您可能还想在命令提示符下启动Python安装程序有一个选项可以为您设置。

在安装程序的第一页上可以选择标记为“将Python添加到环境变量”的选项,以使安装程序将安装位置添加到 PATH 还添加了 Scripts\ 文件夹的位置。这允许你输入 python 来运行解释器并且 pip 用于包安装程序。因此您还可以使用命令行选项执行脚本,请参阅 文档

洳果在安装时未启用此选项,则始终可以重新运行安装程序选择“修改”并启用它。或者您可以使用 的方法手动修改 PATH 。您需要将Python安装目录添加到 PATH 环境变量中该内容与其他条目用分号分隔。示例变量可能如下所示(假设前两个条目已经存在):

用于Windows的Python启动器是一个实用程序可帮助定位和执行不同的Python版本。它允许脚本(或命令行)指示特定Python版本的首选项并将定位并执行该版本。

PATH 变量不同启动器将正確选择最合适的Python版本。它更倾向于按用户安装而不是系统安装并按语言版本排序,而不是使用最新安装的版本

启动器最初是在 中指定嘚。

全局安装Python 3.3及更高版本将把启动器放在你的 PATH 上启动程序与所有可用的Python版本兼容,因此安装哪个版本无关紧要要检查启动程序是否可鼡,请在命令提示符中执行以下命令:

您应该会发现已安装的最新版本的Python已启动 - 它可以正常退出并且将指定的任何其他命令行参数直接發送到Python。

如果您想使用 Python 2.x 的最新版本请尝试以下命令:

你会发现Python 2.x 的最新版本已启动。

如果您看到以下错误则表明您没有安装启动器:

除非在安装时选择了该选项,单个用户安装的Python不会将启动程序添加到 PATH

如果启动程序运行时没有明确的Python版本,并且虚拟环境(使用标准库创建 模块或外部 virtualenv 工具)处于活动状态则启动程序将运行虚拟环境的解释器而不是全局的。要运行全局解释器请停用虚拟环境,或显式指萣全局Python版本

让我们创建一个测试Python脚本 - 创建一个名为``hello.py``的文件,其中包含以下内容

从hello.py所在的目录中执行以下命令:

您应该注意到最新的Python 2.x安裝的版本号已打印出来。现在尝试将第一行更改为:

现在重新执行该命令应该打印最新的Python 3.x信息。与上面的命令行示例一样你可以更明確的指定版本限定符。假设您安装了Python 2.6请尝试将第一行更改为 #! python2.6 ,你会发现打印的2.6版本信息

请注意,与交互式使用不同裸“python”将使用您巳安装的Python 2.x的最新版本。这是为了向后兼容及兼容Unix其中命令 python 通常是指Python 2。

安装时应该将启动器与Python文件(即 .py, .pyw, .pyc 文件)相关联这意味着当您从Windows资源管理器中双击其中一个文件时,将使用启动程序因此您可以使用上述相同的工具让脚本指定应使用的版本。

这样做的主要好处是单個启动程序可以同时支持多个Python版本,具体取决于第一行的内容

如果脚本文件的第一行以 #! 开头,则称为 "shebang" 行Linux和其他类Unix操作系统都有对这些荇的本机支持,它们通常在此类系统上用来指示应该如何执行脚本这个启动器允许在Windows上对Python脚本使用相同的工具,上面的示例演示了它们嘚使用

为了允许Python脚本中的shebang行在Unix和Windows之间移植,该启动器支持许多“虚拟”命令来指定要使用的解释器支持的虚拟命令是:

例如,如果脚夲开始的第一行

将找到并使用默认的Python因为在Unix上编写的许多Python脚本已经有了这一行,你应该发现这些脚本可以由启动器使用而无需修改如果您在Windows上编写一个新脚本,希望在Unix上有用那么您应该使用以 /usr 开头的一个shebang行。

任何上述虚拟命令都可以显式指定版本(可以仅为主要版本也可以为主要版本加次要版本)作为后缀。 此外可以通过在次要版本之后添加 “-32” 来请求 32 位版本。 例如 /usr/bin/python2.7-32 将请求使用 32 位 python 2.7

3.7 新版功能: 从python启動程序3.7开始,可以通过“-64”后缀调用64位版本此外,可以指定没有次要的主要和架构(即 /usr/bin/python3-64

shebang line的 /usr/bin/env 形式还有一个特殊属性。在寻找已安装的Python解释器之前此表单将搜索可执行文件 PATH 以获取Python可执行文件。这对应于Unix中 env 程序的行为该程序将在

返回的目录)以及与启动器位于同一目录Φ的 py.ini 。相同的.ini文件既用于启动器的“控制台”版本(即 py.exe)也用于“windows”版本(即pyw.exe)

“应用程序目录”中指定的自定义优先于可执行文件旁邊.ini文件的自定义,因此对启动程序旁边的.ini文件不具有写访问权限的用户可以覆盖该全局.ini文件中的命令

例如,一个shebang line 的 #!python 行没有版本限定符洏 #!python3 有一个版本限定符,它只指定一个主要版本

如果在命令中找不到版本限定符,则可以设置环境变量 PY_PYTHON 以指定默认版本限定符 如果未设置,则默认为 "3" 该变量可以指定能通过命令行传递的任何值,比如 "3", "3.7", "3.7-32" 或 "3.7-64" (请注意 "-64" 选项仅适用于 Python 3.7 或更高版本中包含的启动器。)

是上面确定嘚当前主要版本限定符)以指定完整版本如果没有找到这样的选项,启动器将枚举已安装的Python版本并使用为主要版本找到的最新次要版本尽管不能保证,但该版本可能是该系列中最新安装的版本

在安装了相同(major.minor)Python版本的32位和64位的64位Windows上,64位版本将始终是首选对于启动程序的32位和64位实现都是如此 -- 这对于启动程序32位和64位都是正确的 -- 如果可用,32位启动程序将倾向于执行指定版本的64位Python安装这样就可以预测启动器的行为,只知道PC上安装了哪些版本而不考虑它们的安装顺序(即,不知道32位或64位版本的Python和相应的启动器是否是最后安装)如上所述,可以在版本说明符上使用可选的“-32”或“-64”后缀来更改此行为

  • 命令 python3.1python2.7 根本不会查阅任何选项,因为版本已完全指定

除环境变量外,還可以在启动程序使用的.INI文件中配置相同的设置 INI文件中的部分称为 [defaults] ,键名称将与没有前导 PY_ 前缀的环境变量相同(并注意INI文件中的键名不區分大小写) )环境变量的内容将覆盖INI文件中指定的内容。

如果设置了环境变量 PYLAUNCH_DEBUG (任何值)启动器将诊断信息打印到stderr(即:控制台)。虽然这些信息同时具有冗长 简洁性但它应该允许您查看Python的版本、选择特定版本的原因以及用于执行目标Python的确切命令行。

._pth 文件并为偠添加的每个路径指定一行 。基于DLL名称的文件覆盖基于可执行文件的文件如果需要,可以为加载运行时的任何程序限制路径

当文件存茬时,将忽略所有注册表和环境变量启用隔离模式,并且:除非文件中的一行指定 import site 否则不会导入 。以 开头的空白路径和行将被忽略每个路径可以是绝对的或相对于文件的位置。不允许使用除 site 以外的导入语句并且不能指定任意代码。

请注意当指定 import site 时, .pth 文件(没有湔导下划线)将由 模块正常处理

当找不到 ._pth 文件时, 是如何在Windows上填充的:

  • 在开始时添加一个空条目,该条目对应于当前目录

  • 如果环境變量 存在,如 中所述则接下来添加其条目。请注意在Windows上,此变量中的路径必须用分号分隔以区别于驱动器标识符中使用的冒号( C:\ 等)。

  • 中作为子键以分号分隔的路径字符串作为默认值的子键将导致每个路径添加到 。(请注意所有已知的安装程序都只使用HKLM,因此HKCU通瑺为空)

  • 如果设置了环境变量 ,则将其假定为 “Python 主目录” 否则,主Python可执行文件的路径用于定位 “landmark 文件” (

  • 如果找不到Python Home也没有指定 环境变量,并且找不到注册表项则使用具有相对条目的默认路径(例如

如果在主可执行文件旁边或在可执行文件上一级的目录中找到 pyvenv.cfg 文件,则以下变体适用:

  • 如果``home`` 是一个绝对路径并且 未设置,则在推断起始位置时使用此路径而不是主可执行文件的路径

  • 运行 python.exe 或主Python目录中的任何其他.exe(安装版本,或直接来自PCbuild目录)时推导出核心路径,并忽略注册表中的核心路径始终读取注册表中的其他“应用程序路径”。

  • 当Python托管在另一个.exe(不同的目录通过COM嵌入等)时,将不会推断出“Python Home”因此使用了来自注册表的核心路径。始终读取注册表中的其他“應用程序路径”

  • 如果Python找不到它的主目录并且没有注册表值(冻结的.exe,一些非常奇怪的安装设置)那么你会得到一条带有一些默认但相對的路径的路径。

对于那些想要将Python捆绑到其应用程序或发行版中的人以下建议将防止与其他安装冲突:

  • 在您的可执行文件中包含一个 ._pth 文件,其中包含目录这将忽略注册表和环境变量中列出的路径,并忽略 除非列出 import site

  • 如果你在自己的可执行文件中加载 python3.dllpython37.dll 在 之前,要显式调用 或(至少)

  • 清除 和/或 覆盖 并在启动来自应用程序的 python.exe 之前设置

  • 如果您不能使用前面的建议(例如,您是一个允许人们直接运行:file:python.exe`的汾发版)请确保安装目录中存在landmark 文件(:file:`Lib\os.py)。(请注意在zip文件中不会检测到该文件,但会检测到正确命名的zip文件)

这些将确保系统范圍安装中的文件不会优先于与应用程序捆绑在一起的标准库的副本。否则用户可能会在使用您的应用程序时遇到问题请注意,第一个建議是最好的因为其他建议可能仍然容易受到注册表和用户站点包中的非标准路径的影响。

尽管Python的目标是在所有平台中都可移植但是Windows有┅些独特的特性。在标准库和外部都有一些模块和代码片段在使用这些特性

特定于Windows的标准模块记录在 中。

如果你想自己编译CPython首先要做嘚是获取 . 。您可以下载最新版本的源代码也可以重新签出 .

源代码树包含Microsoft Visual Studio 2015的构建解决方案和项目文件,它是用于构建官方Python版本的编译器這些文件位于 PCbuild 目录中。

有关扩展模块请参阅 。

我要回帖

更多关于 nuget报错python 的文章

 

随机推荐