为 Python 包创建一个轮子

包是 Python 中提高代码可重用性的重要元素。通过使用包,我们可以使用别人写的代码,也可以让别人使用我们的代码。有一种非常有趣的数据文件类型,称为轮子,它可用于创建包并使其全局可用,下面的文章详细介绍了该轮子文件的方式、原因和内容。让我们了解如何为我们的包创建一个wheel文件。

Python 中的包是什么?

Python 包是在一个位置包含子包和模块的容器/文件夹。在此目录中包含“__init__.py”文件是必不可少的。 

Python 包和 Python 模块之间存在差异。要更好地了解差异,请参阅此链接。

“__init__.py”是一个初始化文件,它可以为空,也可以包含有关导入模块的信息。

包通常提供一些功能,其他程序可以通过使用导入来使用这些功能[要了解Python导入,请参阅前面的链接]。 

Python 中的轮子是什么?

Wheel 文件本质上是 Python 包。每次您使用终端使用’pip’安装软件包时,您实际上是在安装一个wheel文件。Wheel 文件可以被识别为带有“.whl”扩展名的文件。

pip install numpy   #This will install numpy wheel file

为了获得更好的直观理解,请查看pypi上的任何包。您可能会注意到包内的几乎所有文件都是轮文件。

为什么要为我们的 Python 包创建一个轮子

为我们的Python包创建一个wheel文件是至关重要的,这样我们的包就可以分发到不同的地方。Wheel 文件比源发行版相对要快,并且它们不占用太多空间,因为它们比源发行版更小。

创建“.whl”文件后,您只需在系统中使用 pip 安装它,如下所示。

pip install <created '.whl' file#Directly install a previously written file.

在本文中,我们不仅将研究为 Python 包创建“.whl”文件的“原因”,还将研究“如何”创建“.whl”文件。我将使用 PyCharm 作为 IDE。IDE 的选择权完全由您决定。

准备包裹

首先,我们将创建一个包,稍后我们将在其中创建一个“.whl”文件。

让我们从创建一个包开始,为此,首先创建一个目录,稍后将在当前项目中将其暂存为包。

在新创建的目录中,创建一个“.py”文件,我们将在其中创建包的一些功能。我们还需要同一目录中的“__init__.py”文件。

目录结构

[如果您到目前为止已经阅读了本文,那么您的目录结构应该是这样的。]

让我们创建一个具有一些基本功能的计算器包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#This is how your ‘calc.py’ will look like
 
 
def add(a,b):
       return a+b
 
def subtract(a,b):
       return a-b
 
def multiply(a,b):
       return a * b
 
def divide(a, b):
       return a / b

让我们在“__init__.py”文件中编写一些代码,以便它开始识别我们的计算器包。

# This is how your ‘__init__.py’ file will look like
 
from .calc import add, subtract, divide, multiply

之后,您将需要“setuptool”包。您可以使用以下命令通过 pip 安装它。

pip install setuptools  #This will install the setup tools package

“setup.py”文件

现在我们将开始设置“setup.py”文件,它是另一个导入文件。首先在包目录之外但在同一项目内创建一个新的“.py”文件。将新文件命名为“setup.py”。

1
2
3
4
5
6
7
8
9
#This is what your ‘setup.py’ file should look like.
 
from setuptools import setup, find_packages
 
setup(
    name="calc", #Name
    version="1.0", #Version
    packages = find_packages()  # Automatically find the packages that are recognized in the '__init__.py'.
)

建造/创造一个轮子

到目前为止,我们已经创建了一个只能在该特定目录中导入的包,而不能在其他任何地方导入,但是如果您一直遵循到目前为止,我绝对认为您希望您的包能够从任何你想的地点都可以。

那么让我们看看是否可以对此做点什么。

首先,进入 IDE 的终端并导航到包的父目录,在我的例子中是“test_whl_pkg”。到达父目录后,在终端中写入以下语句。

python3 setup.py bdist_wheel  #Write inside terminal after navigating to the parent directory.

“bdist_wheel”关键字是真正的游戏规则改变者,它将 setup.py 文件的二进制发行版创建为轮子。输入语句后,您将看到正在进行一些处理,如下所示。这可能需要几秒钟,具体取决于您的机器。

终端状态

就是这样!您终于为 Python 包创建了一个轮子。您可能会在侧边栏中看到一些已加载的新目录。

只需打开“dist”目录,它就在那里,您可以轻松地从计算机上的任何位置导入它。要安装,首先从“dist”目录复制轮子的名称,然后从终端使用 pip 导入它。

新的目录结构
pip install <name_of_wheel_in_dist_directory>

运行此行后,如果没有错误,它将加载该包,并且您将能够从计算机中当前目录之外的任何位置访问该包,并且可以像您一样访问包的功能与您导入的任何其他包或模块一起使用。

安装成功

概括

基本上,我们首先根据我们的要求创建一个包并赋予它一些功能,然后创建一个“__init__.py”文件,在其中标记该包,并使其识别该包。

完成此操作后,我们创建“setup.py”文件,在其中提及包的名称、版本和其他特征。

最后,我们导航到包的父目录,并根据“setup.py”文件中提到的参数使用“bdist_wheel”命令创建一个wheel文件。

如果此过程中没有错误,您很快就会在当前目录中看到一个 dist 目录,您可以在其中找到刚刚创建的轮子,可以从计算机上的任何位置使用 pip 命令访问该轮子,并且可以就像使用从“pypi”安装的任何其他包一样使用。

参考

官方 python 包文档。