Python 如何使用自己的包

在 Python 中,我们可以使用模块(Module)来组织和管理我们的代码。模块是 Python 中的一种组织代码的方式,可以将相关的代码放在一个模块中,方便重复使用和维护。但是当我们的代码变得越来越多时,单独使用模块已经不足以满足我们的需求了,这时候就需要使用包(Package)来组织我们的模块。

一个包其实就是一个目录,它包含了多个模块和子包。在包的目录下,我们需要创建一个名为 __init__.py 的文件,它可以是一个空文件,也可以包含一些初始化代码。这个文件告诉 Python 这个目录是一个包,可以被导入和使用。

下面我们通过一个例子来演示如何创建和使用自己的包。

创建包

假设我们要创建一个名为 my_package 的包,它包含了两个模块 module1module2

首先,我们需要创建一个名为 my_package 的目录,并在该目录中创建一个名为 __init__.py 的文件。

my_package/
    __init__.py
    module1.py
    module2.py

module1.py 中,我们定义了一个简单的函数。

# module1.py

def hello(name):
    print(f"Hello, {name}!")

module2.py 中,我们定义了一个类和一个常量。

# module2.py

PI = 3.14159

class Circle:
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):
        return PI * self.radius ** 2

使用包

现在我们已经创建了包和模块,下面来看看如何使用它们。

首先,我们需要将包所在的目录加入到 Python 的搜索路径中。可以使用 sys.path.append() 方法来添加路径。

import sys

sys.path.append('/path/to/my_package')

然后,就可以使用 import 语句导入模块了。

from my_package import module1

module1.hello('Alice')  # 输出:Hello, Alice!

我们也可以使用 import 语句导入整个包,然后使用点操作符来访问模块和其中的函数、类和常量。

import my_package

my_package.module1.hello('Bob')  # 输出:Hello, Bob!

或者,我们可以使用 from ... import ... 语句来直接导入某个模块、函数、类或常量。

from my_package.module2 import Circle, PI

circle = Circle(5)
print(circle.area())  # 输出:78.53975
print(PI)  # 输出:3.14159

包的高级用法

除了上述基本用法外,Python 的包还有一些高级用法,下面我们来介绍两个常用的高级用法。

__init__.py 文件的作用

在包的目录中,我们创建了一个名为 __init__.py 的文件,它的作用是初始化包的导入行为。

# __init__.py

print("Initializing my_package...")

当我们导入包时,__init__.py 文件会被执行,输出初始化信息。

import my_package  # 输出:Initializing my_package...

我们也可以在 __init__.py 文件中定义一些初始化代码,比如导入一些常用的模块或设置一些全局变量。

使用 setup.py 打包包

当我们的代码准备好之后,可以使用 setup.py 文件将包打包为可分发的格式,比如 .whl.tar.gz 文件。

from setuptools import setup, find_packages

setup(
    name='my_package',
    version='0.1',
    packages=find_packages(),
    install_requires=[
        'numpy',
        'matplotlib',
    ],
)

setup() 函数中,我们可以指定包的名称、版本、依赖关系等信息。find_packages() 函数会自动找到包和子包。

然后,我们可以使用 python setup.py bdist_wheel 命令将包打包为 .whl 文件。

$ python setup.py