1.vue/compiler-sfc源码分析学习--part2:如何处理script--day5
2.python安装带有setup.py的库包以及解决问题
3.python打包分发工具:setuptools
4.torchvision应用与源码分析
5.花了两天,终于把 Python 的 setup.py 给整明白了
6.python setuptool包介绍
vue/compiler-sfc源码分析学习--part2:如何处理script--day5
在vue/compiler-sfc源码分析学习系列的part2中,我们深入探讨了script部分的处理。今天是系列的最后一天,我们将重点关注script的生成和转换。
首先,溯源码意思setup返回语句部分主要判断了使用的是template、inlineTemplate还是render函数。对于常规template,我们进入了第一部分逻辑,返回的`returned`包含了变量、函数、类等,但不包括defineProps、defineEmits和defineExpose这些特殊处理。
对于inline或render函数的处理,虽然重要,但这里暂且不表,留待后续章节。在`export default`部分,除了boolean类型和带有默认值的函数,其余类型定义会被移除,以符合非setup语法的要求。
接着,代码将解析后的数据整理成非setup语法糖形式,包括合并非setup块的export和导入。这部分,我们直接展示了最终的script代码,以直观展示转换过程。
在代码中,有几个关键点值得注意,特别是辅助函数的加入,如mergeDefaults,用于合并默认值。最后,总结部分重申,今天是script处理的尾声,主要工作是将setup语法糖转化为直观的代码,尤其是ICON源码复现处理props部分的复杂性。
python安装带有setup.py的库包以及解决问题
对于Python中安装带有setup.py的库包,理解是关键。常规情况下,pip install命令可以轻松处理大部分依赖。然而,一些源代码库会以带setup.py的文件夹形式提供,这需要特殊的处理方式。
这些文件夹实质上是第三方开发者创建的自定义库,为了跨平台兼容,它们没有直接提供预编译的版本。与C库类似,Python库可能需要编译过程,通过setup.py文件进行,以转化为系统能识别和运行的格式,类似于CMake在C开发中的作用。
安装步骤包括在命令行中,如cmd,进入setup.py文件夹,可能需要先激活特定的Python环境。如果遇到编译错误,可能是因为缺少Visual C++ Build Tools,尤其是当提示安装庞大的Microsoft Visual Studio时,可以考虑安装Visual C++ Build Tools的离线包,这将简化安装过程并解决编译问题。
如果对下载大软件感到困扰,另一种选择是寻找预编译的.whl(wheel)文件,这是一种编译好的库文件。可以从lfd.uci.edu/~gohlke/pytorch/等网站找到对应的whl文件,确保Python版本匹配后,将文件放置到Python或anaconda的Scripts文件夹,并通过pip install命令安装。
总的来说,安装带有setup.py的库包需要理解其原理,正确操作并可能需要解决特定的编译问题,但一旦掌握,就能方便地扩展Python环境。新手可能需要花费一些时间,但这是摄影预约源码值得的,因为这能让你更深入地了解Python库的安装过程。
python打包分发工具:setuptools
setuptools是Python打包与分发的利器,它简化了库的创建与分发过程,使得开发者能够通过简单的命令实现库的安装。
setuptools的前身是distutils,它提供了打包与分发的功能。setuptools的功能包括源码包和二进制包的创建。
源码包sdist是常见的压缩包形式,包含库的源码及一些静态文件。打包源码包主要使用setup.py,通过formats参数指定压缩格式。安装源码包可选择解压缩后安装或直接安装。
二进制包bdist以wheel形式存在,格式为.whl,无需编译,安装更快。打包与分发二进制包同样使用setup.py,通过formats参数指定格式。
setup.py是打包过程的核心,它控制了重要的配置信息。通过packages、include_package_data、exclude_package_data、package_data、data_files参数指定需要打包的文件。
setup.py参数packages用于指定需要打包的package,类型为list[str]。find_packages和find_namespace_packages函数可快速找到所有package。
include_package_data参数用于根据MANIFEST.in文件打包非源码文件。package_data参数直接指定非源码文件。
依赖包的安装与版本管理由setup函数的install_requires、setup_requires、tests_require和extras_require参数实现。
对于python版本限制,使用python_requires参数指定。
setup函数的entry_points和scripts参数用于生成命令行脚本。而C/C++扩展则通过python setup.py build_ext --inplace命令进行编译。
主要通过setup函数的虚幻源码编译ext_modules参数进行C/C++扩展的编译,setuptools.Extension类用于指定扩展参数。setuptools.Extension用define_macros和undef_macros参数定义或取消定义宏。
自定义命令行为是setuptools的高级特性,通过继承setuptools.command类来实现。需要通过cmdclass参数告知setuptools,该参数是一个字典,key为命令名,value为继承的类。
torchvision应用与源码分析
torchvision是PyTorch库中的一部分,用于计算机视觉任务,它包含了一系列的预训练模型和数据集。
一:torchvision应用
在计算机视觉领域,torchvision提供了方便的API,用于加载和处理图像数据,训练模型和进行预测。它通常与PyTorch深度学习框架结合使用,为用户提供了一个完整的框架来开发和部署计算机视觉应用。
二:torchvision源码分析
1. setup.py分析
setup.py是Python包的配置文件,用于描述包的元数据和安装步骤。在torchvision中,setup.py文件被用来编译和安装包的依赖库。
1.1 导入依赖的模块
1.2 从配置文件中获取当前torchvision的版本信息
1.3 获取依赖的torch版本信息
1.4 获取编译扩展信息,然后传递给setup函数,启动编译
1.5 重点:get_extensions分析
在torchvision的setup.py文件中,get_extensions函数是核心部分,它负责编译torchvision自身的源码以及一些第三方库,如jpeg和codec等。
1.5.1 获取ccsrc下面的cpp源码
1.5.2 获取环境变量中配置的编译选项
1.5.3 判断是AMD的HIP还是nVidia的CUDA,来获取到最终的cuda文件
1.5.4:依据环境上是否支持cuda来确定编译扩展
1.5.5 添加扩展
至此,torchvision就将整个版本包编译出来了,会调用torch的cpp和cuda编译扩展(即:通过gcc+nvcc来编译ccsrc下面的源码,而不用torchvision自行再来设置各种编译环境信息了)。
整个编译核心流程总结如下:
2. torchvision新增算子流程
以torchvision.ops.DeformConv2d为例
2.1 基础用法与模型结构
通过Netron工具打开模型结构,可以看到torchvision的deform_conv2d是单独的IR定义的算子
2.2 python侧实现分析
deform_conv2d定义在Python侧,实际上做了参数初始化后,将转交给了C++侧对应的接口
2.3 C++侧分析:torch.ops.torchvision.deform_conv2d
2.3.1 接口定义
2.3.2 接口实现
关键在于这两个接口的注册
算子的具体实现和如何向pytorch完成注册呢?
该算子有C++和CUDA实现方式,C++方式可以在纯CPU版本中运行,cuda实现则依赖于GPU和CUDA
2.3.2.1 C++实现
2.3.2.2 CUDA实现
这种方式实现的茅台渊源码算子,trace出来的模型中,为单个算子
总结:自定义算子向torch集成分为两步
三:基于torchvision新增一个算子
实现一个算子:my_add = 2*x + y
3.1 环境准备
花了两天,终于把 Python 的 setup.py 给整明白了
为了便于理解与操作,我们首先需要明确为何要对项目进行分发与打包。在日常开发中,我们通常通过pip来安装第三方模块,这一过程之所以简便,是因为模块开发者已经为我们完成了复杂的工作。而这个工作过程即为打包,它将源代码进行进一步封装,并预先安排好项目部署,使得用户只需简单操作即可使用,无需再关注复杂的部署细节。
随着Python的发展,项目打包工具已相当成熟。让我们来了解一下其中的关键工具。
distutils是Python的一个标准库,它是一个基础的分发工具,从命名上可以看出其本质在于封装与分发(distribute)。它是官方提供的分发与安装指导文件setup.py的基石。
setup.py文件是模块分发与安装的核心,编写setup.py的过程包含了许多复杂的内容,我将在后续的篇章中详细解析,希望你能够耐心阅读。
你可能未曾编写过setup.py,但你一定使用过它来进行模块的安装,例如使用pip命令进行源码安装。同样,也存在通过二进制软件包进行安装的选项,关于这一点,我将在后续进行介绍。
setuptools是distutils的增强版本,虽然未包含在标准库中,它提供了更多的功能,旨在帮助开发者更高效地创建与分发Python包。大部分Python用户都使用更先进的setuptools模块。
另一个与setuptools相关的组件是distribute,它是一个分支版本,后来被合并回setuptools。因此,它们实际上代表同一工具。
另一个大型包分发工具是distutils2,该工具试图充分利用distutils、detuptools和distribute,成为Python标准库中的标准工具。但该计划未达到预期目标,现已废弃。因此,setuptools是一个非常优秀的、可靠的Python包安装与分发工具。
如果你想要在干净的环境中安装setuptools,主要有两种方法。
其中一种方法是使用easy_install工具,它是一个第三方管理工具,能够提供比distutils更便捷的体验。这里简单介绍一下它的用法,尽管它现在使用较少。
easy_install支持包的安装、升级与删除。需要注意的是,删除操作仅在easy-install.pth文件中执行,使其无法在Python中使用,但实际的包仍然存在于你的电脑中。若要彻底删除,需要手动删除相关的.egg及其他文件。
默认情况下,easy_install会从pypi下载包,但由于该源在国外,下载速度可能不理想。使用过pip的朋友可能想了解,easy_install是否能够指定源进行安装呢?答案是肯定的。可以通过编辑配置文件/root/.pydistutils.cfg来实现。
总结来说,setuptools是一个专业用于包分发的工具,从安装的角度来看,它的功能看似简单。然而,其更大的意义在于包的分发,具有极高的定制化程度。我们至今仍在使用它进行版本包的发布。
Python包的分发主要分为两种方式:源码包与二进制包。源码包安装过程包括解压、编译与安装,因此它是跨平台的,但由于每次安装都需要编译,相对二进制包安装方式来说,安装速度较慢。源码包实质上是一个压缩包,常见的格式有...
接下来,我们深入探讨egg与wheel的区别。egg格式由setuptools在年引入,而wheel格式由PEP在年定义。Wheel被认为是Python二进制包的标准格式。以下是Wheel和egg的主要区别...
在编写setup.py时,它最关键的一步是实现。以下是一个setup.py简单的使用示例。接下来,我将逐步扩展这个setup函数,增加更多的参数,以便你能够理解setup函数的功能。
程序分类信息、文件分发、依赖包下载安装、安装环境限制、生成可执行文件分发、构建C和C++扩展包、指定release、参数列表等,都需要在setup.py文件中进行详细配置。在编写时,可能会遇到较多的参数,因此,为了方便查阅,我整理了setup函数常用的一些参数。
最后,我们介绍pbr,这是一个setuptools的辅助工具,最初是为了OpenStack开发。pbr会读取和过滤setup.cfg中的数据,然后将解析后的数据提供给setup.py作为参数。包含如下功能...
通过学习,你已经学会了如何打包自己的项目。若你认为自己开发的模块非常出色,想要与他人共享使用,你可以将其上传至PyPi(Python Package Index),它是Python官方维护的第三方包仓库,用于统一存储与管理开发者发布的Python包。首先,你需要在PyPi注册账号,然后创建~/.pypirc文件,配置PyPI访问地址和账号。接下来,使用相应的命令进行注册与上传,即可在PyPi上看到项目信息,并允许他人下载安装。
python setuptool包介绍
Python的setuptools是一个关键工具,专为构建和分发Python包而设计。它整合了一系列强大功能,用于管理和定义包的元数据、依赖关系以及构建选项,还能生成易于安装的包。以下是setuptools的基本应用步骤:安装:使用pip简单快捷,只需在命令行输入`pip install setuptools`。
配置:创建核心的setup.py文件,替换`your_package_name`为你的包名,描述你的包功能,将依赖项列表如['dependency1', 'dependency2']替换为实际的依赖。`setup()`函数可添加作者和许可证等额外信息。
构建:
生成wheel文件(可分发的二进制包):在项目根目录下,执行`python setup.py bdist_wheel`,会在dist目录下生成一个`--py3-none-any.whl`文件。
创建源码分发包(tar.gz文件):若需要源码包,运行`python setup.py sdist`,dist目录下会生成一个`.tar.gz`文件。
通过setuptools,开发者可以高效地管理和构建自己的Python包,确保它们在不同环境中正确安装和运行。
QMSetup:多功能 CMake 辅助配置工具
qmsetup是一个专注于为CMake配置过程提供更人性化支持的强大辅助工具。它由一系列的.cmake文件组成,作为一个脚本包,为CMake配置过程提供便利。首先,让我们了解一下qmsetup的安装方法。尽管qmsetup中包含了需要编译的程序,它在用户执行配置CMake时发挥作用,因此不能通过子模块的方式引入,需要先进行编译和安装。
所有CMake脚本都位于源代码仓库的cmake目录内,主模块QMSetupAPI.cmake在执行find_package时会被引入。其他模块则通过qm_import指定不包含扩展名的文件名进行引入,或者通过添加查找模块参数进行引入。
在构建与安装配置参数方面,CMake支持模块引入,qmsetup提供了丰富的功能。例如,使用qm_find_qt可以查找Qt库,qm_link_qt用于链接Qt库,qm_include_qt_private则用于包含Qt库的私有头文件目录。此外,qmsetup还支持自动配置目标,如qm_configure_target可以批量对目标进行target_xxx函数操作。为了实现更直观的头文件目录包含,qmsetup提供了dir/*和dir/**的扩展方式,将扩展为目录及其所有子目录或递归所有子孙目录。
在处理特定平台的配置时,qmsetup同样表现出色。针对Windows资源文件的处理,qm_add_win_rc可以为目标添加rc资源,并设置各种信息。对于Mac Bundle,qm_add_mac_bundle则可设置目标为Mac包,并配置相应的信息。为了提高构建过程的自动化水平,qmsetup提供了预处理功能,包括重新排列头文件、生成宏定义和生成构建信息。这些功能在一定程度上解决了C/C++项目中头文件结构与项目逻辑结构不一致的问题。
在生成宏定义方面,qmsetup提供了qm_add_definition、qm_remove_definition和qm_generate_config函数,允许用户在CMakeLists.txt中添加、删除和生成宏定义头文件。通过这些函数添加的宏定义会被临时存储在GLOBAL属性中,开发者可以使用QMSETUP_DEFINITION_SCOPE参数或添加特定参数来自定义存储对象。
qmsetup还提供了自动部署依赖的功能,包括自动解析和部署目录内的可执行文件与动态库依赖,并修复rpath。为了进一步提高构建过程的自动化,qmsetup提供了自动拷贝文件功能,允许在指定目标构建后自动将文件或目录拷贝到目标位置,并根据时间戳决定是否覆盖。此外,qmsetup还支持Doxygen文档生成、Qt翻译更新发布,并为不使用Qt的C++工程提供了额外的支持。
qmsetup的功能远不止于此,它定义了一组头文件,包含Qt常用的宏以及Qt隐式数据共享类,旨在为CMake构建系统提供更人性化的体验。为了满足不同用户的需求,qmsetup的find-modules目录内包含了YY-Thunks与VC-LTL5的搜索支持。如果您想深入了解qmsetup的更多信息,建议查阅其仓库文档。
总的来说,qmsetup是为支援CMake构建系统而设计的脚本库,旨在为CMake构建系统提供更人性化的配置体验。