1.解密Python C++库打包到wheel的正确方法
2.Netty源码解析 -- FastThreadLocal与HashedWheelTimer
3.FreeBSD 7.3 安装GNOME图形界面
4.花了两天,终于把 Python 的 setup.py 给整明白了
5.Python Wheel库入门指南
6.web前端js使用pyodide调用python函数/算法
解密Python C++库打包到wheel的正确方法
当你创建扩展并需要将其打包成wheel文件发布时,正确的操作流程至关重要。为确保包的结构及依赖库的正确打包,通常需要关注两个主要方面:包的结构与依赖库如何处理。
为了深入了解wheel包的路径填充 c源码构建,可以参考opencv-python源码。它通过scikit-build与CMake实现跨平台编译,简化了不同环境的构建流程。在实际操作中,使用scikit-build的示例工程可以直观地体验wheel构建过程。例如,通过在setup.py文件中定义包名,并在CMakeLists.txt中配置编译环境,即可利用pip wheel .命令生成wheel包。
通过解压生成的wheel包,可以发现它具有特定的目录结构,包含dist-info和用户定义的包文件夹。在包文件夹中,包含编译生成的库文件及__init__.py文件,这与直接使用python setup.py bdist_wheel打包的包结构存在差异。后者将库文件直接打包在根目录下,导致库文件污染Lib\site-packages目录,影响环境安全。
若扩展依赖其他库,需考虑库的链接与打包策略。在Windows环境下,库可放在同一目录下。然而,对于Linux和macOS等系统,需要设置相对路径,并注意不同系统的配置方法。CMake作为编译工具,提供了灵活的解决方案。
若选择不使用CMake,通过setuptools同样可以实现类似效果。在setup.py文件中,需配置编译参数与依赖库拷贝策略。首先通过判断系统与CPU架构,添加相应编译参数,随后设置自定义函数,触发build_ext.build_ext.run(self)方法进行编译,郑源码头壁纸生成所需的Python库,并将使用到的库文件复制至输出目录。打包命令完成后,会将输出目录下的所有文件打包为wheel文件。
针对Linux环境生成的wheel包,可能需要通过auditwheel的repair命令重新生成,以确保支持manylinux标准,从而避免无法上传至pypi的问题。
为了实现自动化流程,可在GitHub Action中创建编译、打包与发布的流程。通过此方式,可以确保各种主流Python环境的包均能正确生成。
相关源码请参见:github.com/yushulx/pyth...
Netty源码解析 -- FastThreadLocal与HashedWheelTimer
Netty源码分析系列文章接近尾声,本文深入解析FastThreadLocal与HashedWheelTimer。基于Netty 4.1.版本。 FastThreadLocal简介: FastThreadLocal与FastThreadLocalThread协同工作。FastThreadLocalThread继承自Thread类,内部封装一个InternalThreadLocalMap,该map只能用于当前线程,存放了所有FastThreadLocal对应的值。每个FastThreadLocal拥有一个index,用于定位InternalThreadLocalMap中的值。获取值时,首先检查当前线程是否为FastThreadLocalThread,如果不是,则从UnpaddedInternalThreadLocalMap.slowThreadLocalMap获取InternalThreadLocalMap,这实际上回退到使用ThreadLocal。 FastThreadLocal获取值步骤: #1 获取当前线程的InternalThreadLocalMap,如果是FastThreadLocalThread则直接获取,否则通过UnpaddedInternalThreadLocalMap.slowThreadLocalMap获取。#2 通过每个FastThreadLocal的index,获取InternalThreadLocalMap中的值。
#3 若找不到值,则调用initialize方法构建新对象。
FastThreadLocal特点: FastThreadLocal无需使用hash算法,通过下标直接获取值,复杂度为log(1),性能非常高效。 HashedWheelTimer介绍: HashedWheelTimer是Netty提供的时间轮调度器,用于高效管理各种延时任务。蜜趣导航源码时间轮是一种批量化任务调度模型,能够充分利用线程资源。简单说,就是将任务按照时间间隔存放在环形队列中,执行线程定时执行队列中的任务。 例如,环形队列有个格子,执行线程每秒移动一个格子,则每轮可存放1分钟内的任务。任务执行逻辑如下:给定两个任务task1(秒后执行)、task2(2分秒后执行),当前执行线程位于第6格子。那么,task1将放到+6=格,轮数为0;task2放到+6=格,轮数为2。执行线程将执行当前格子轮数为0的任务,并将其他任务轮数减1。 HashedWheelTimer的缺点: 时间轮调度器的时间精度受限于执行线程的移动速度。例如,每秒移动一个格子,则调度精度小于一秒的任务无法准时调用。 HashedWheelTimer关键字段: 添加延迟任务时,使用HashedWheelTimer#newTimeout方法,如果HashedWheelTimer未启动,则启动HashedWheelTimer。启动后,构建HashedWheelTimeout并添加到timeouts集合。 HashedWheelTimer运行流程: 启动后阻塞HashedWheelTimer线程,直到Worker线程启动完成。计算下一格子开始执行的时间,然后睡眠到下次格子开始执行时间。获取tick对应的格子索引,处理已到期任务,移动到下一个格子。当HashedWheelTimer停止时,取消任务并停止时间轮。 HashedWheelTimer性能比较: HashedWheelTimer新增任务复杂度为O(1),优于使用堆维护任务的ScheduledExecutorService,适合处理大量任务。然而,uniapp直播盒子源码当任务较少或无任务时,HashedWheelTimer的执行线程需要不断移动,造成性能消耗。另外,使用同一个线程调用和执行任务,某些任务执行时间过久会影响后续任务执行。为避免这种情况,可在任务中使用额外线程执行逻辑。如果任务过多,可能导致任务长期滞留在timeouts中而不能及时执行。 本文深入剖析FastThreadLocal与HashedWheelTimer的实现细节,旨在提供全面的技术洞察与实战经验。希望对您理解Netty源码与时间轮调度器有帮助。关注微信公众号,获取更多Netty源码解析与技术分享。FreeBSD 7.3 安装GNOME图形界面
FreeBSD被认为是自由操作系统中的不知名的巨人。它不是Unix,但如Unix一样运行,具有兼容Unix的系统API。作为一个操作系统,FreeBSD被认为相当稳建可靠。FreeBSD默认是无桌面环境的命令行界面,想要使用桌面环境必须自行安装,或是使用PC-BSD之类的桌面发行版。
通常安装 FreeBSD 选择推荐方式的最小安装,安装完成后再通过编译源码或 pkg_add 命令安装其它软件。一般很少用到图形界面,但有时候有总比没有的好。
安装过程中,创建默认一个普通用户并指定组为 wheel ,因为 ssh 远程登录禁用的 root 用户并且只有 wheel 组的用户可以 su 到 root 用户。
下面安装图表界面:
通过 sysinstall 命令安装 gonme 和 Xorg
复制代码
代码如下:
Configure - Packages - CD/DVD - gnome - gonme2-2..2_1
Configure - Packages - CD/DVD - X - Xorg-7.4_3
安装完成后,不能直接运行 startx 命令,否则启动图形界面后就系统无响应。
先编辑 /etc/rc.conf 文件,增加
复制代码
代码如下:
dbus_enable=”YES”
hald_enable=”YES”
重新启动后,如果出现 “acd0: FAILURE - unknown CMD ...” 的错误信息,执行 hal-disable-polling --device /dev/acd0 命令即可。
再运行 startx 命令,至少我们可以使用 Xorg 的简易的图形界面。
如果使用 gnome 界面,硬核芯片指标源码执行 echo "exec gnome-session" .xinitrc
如果使用 kde 界面,执行 echo "exec startkde" .xinitrc
再运行 startx 即可
我们还可以进一步定制图形界面属性,利于配置刷新率、分辨率等等
使用 root 用户运行 Xorg -configure 生成 xorg.conf.new 文件
复制代码
代码如下:
Section “Monitor”
Identifier “Monitor0″
VendorName “Monitor Vendor”
ModelName “Monitor Model”
HorizSync -
VertRefresh -
EndSection
Section “Screen”
Identifier “Screen0″
Device “Card0″
Monitor “Monitor0″
DefaultDepth
SubSection “Display”
Viewport 0 0
Depth
Modes “×″
EndSubSection
EndSection
再运行 Xorg -config xorg.conf.new -retro 进行测试
如果出现灰格子和 X 形鼠标,Ctrl+Alt+Backspace 退出
测试完成后,运行 cp xorg.conf.new /etc/X/xorg.conf 即可更新
安装 VMware tools 时需要compat6x
compat6x-i-6.4...tbz
在FreeBSD 7.3 安装 GNOME 图形界面
启动默认的 FTP 服务器,编辑 /etc/rc.conf 文件
复制代码
代码如下:
ftpd_enable="YES"
再运行 /etc/rc.d/ftpd start
上传文件后,通过 pkg_add compat6x-i-6.4...tbz 安装后即可安装 VMware tools
运行 mount /dev/acd0 挂载光盘,安装文件挂载到 /cdrom 目录
运行 tar zxvf /cdrom/vmware-freebsd-tools.tar.gz -C /root/ 将安装文件解压到 /root 目录
运行 ./vmware-install.pl 命令后,N 次回车安装完成。
小结:
关于FreeBSD 7.3 安装GNOME图形界面的内容介绍完了,希望通过FreeBSD 的学习能对你有所帮助!
花了两天,终于把 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 Wheel库入门指南
Python的wheel库是一个用于构建和安装Python包的库,它提供了一种高效的二进制格式,使得Python包的分发和安装更加迅速。本文将详细介绍wheel库的安装、基本使用方法、进阶技巧以及如何处理可能出现的异常。
安装wheel库非常简单,可以通过pip命令轻松完成。打开命令行工具,输入以下命令:
这将会从Python包索引(PyPI)下载并安装wheel库及其依赖。
创建一个wheel包首先需要准备一个Python项目,其中包含setup.py文件。setup.py文件包含了项目的元数据和安装要求。以下是一个简单的setup.py文件示例:
在这个例子中,MyProject是项目的名称,0.1是版本号,myproject是包含项目代码的包名。entry_points用于定义命令行工具。
接下来,使用以下命令创建wheel包:
这将在项目目录下生成一个名为dist的文件夹,其中包含了构建的wheel包。
安装wheel包同样简单。首先,确保你已经安装了wheel库。然后,使用pip命令安装wheel包:
将/path/to/package.whl替换为你的wheel包的实际路径。
如果你的项目需要支持Python 2和Python 3,可以在setup.py文件中使用setup函数的use_2to3参数:
这将启用2to3工具,帮助你将Python 2代码转换为Python 3代码。
在使用wheel库的过程中,可能会遇到各种异常。以下是一些常见问题的解决方法:
报错:Wheel版本不兼容
如果遇到wheel版本与pip版本不兼容的问题,可以尝试更新wheel库:
报错:无法找到指定的wheel文件
确保指定的wheel文件路径正确无误。如果路径错误或文件不存在,将无法安装wheel包。
Wheel库的官方社区非常活跃,你可以在GitHub上找到wheel库的源代码和问题跟踪器。如果你在使用过程中遇到问题,可以在那里寻求帮助。
总结,Wheel库是Python包管理中的一个重要工具,它通过提供高效的二进制格式,简化了Python包的分发和安装过程。通过本文介绍的知识,Python初学者可以快速上手并有效地利用wheel库来管理自己的Python项目。
web前端js使用pyodide调用python函数/算法
利用pyodide在web前端调用python函数/算法,使得web应用能够灵活地集成python库和算法,增强功能。
pyodide是一个允许在浏览器中运行python的库,它通过提供一个python运行环境,使得在前端通过js可以调用python代码,包括python库和方法。
为了在web前端调用python文件,首先需要下载pyodide库。官方网址为pyodide.org,源码地址为github.com/pyodide/pyod...
调用python代码的流程主要涉及下载pyodide、编译python wheel文件、在前端引入pyodide相关文件和python程序wheel文件。具体步骤如下:
1. 下载并安装pyodide。可以通过访问pyodide.org获取其相关文档和安装教程。
2. 编译python的wheel文件。需要在python程序的setup配置中指定依赖库。在setup目录下执行python setup.py bdist_wheel命令编译wheel文件。
3. 在web前端引入pyodide相关文件和wheel文件。提供两种方式:在线引用和离线引用。
在线引用只需引入js文件即可使用,而离线引用需要将release文件夹中的依赖文件加入项目。具体步骤包括在html中和vue框架中引用相关文件。
4. 调用python程序中的方法。在前端js中调用python方法时,可以通过创建python环境实例并执行python代码实现。具体示例包括在普通js文件和vue框架中调用python方法。
通过上述步骤,可以在web前端成功调用python函数或算法,实现web应用的扩展功能。
我win写的python,到Linux上说缺少No module named 'pymysql'?
哈哈哈,和和题主有过同样的问题,首先最直接的做法就是pip install这个库,由于题主没有联网,显然是行不通。那就可以考虑离线安装库,直接到网上去下载该库依然是不行的,因为这个库也会有依赖库,反反复复下载会很累的,在这里分享一个非常好用的做法,本做法是本人工作期间常用的,也是最靠谱的:python库离线安装
Step1 下载安装包,以pandas为例
pip3 download pandas -d /home/pkgs/
-d 指的是下载目录
注意: pip的download命令也可以下载指定平台和python版本的库,但是如果加上这些指定版本的参数,就只能下载编译好的wheel,但是有一些依赖包没有提供wheel,只能源码安装,所以会失败.
解释如下:
pip download with the --platform, --python-version, --implementation, and --abi options provides the ability to fetch dependencies for an interpreter and system other than the ones that pip is running on. --only-binary=:all: or --no-deps is required when using any of these options.
--only-binary=:all: 是指不找源码包下载
--no-deps 是指不下载依赖
因此建议在docker里装相同的python环境然后进行下载安装。
Step2 拷贝至离线机器开始安装
pip3 install pandas --no-index --find-links=/pkg_path/
--no-index 是指忽略包索引
--find-links 指定离线包的位置
参考链接:网页链接