Python 如何使用自己的包
在 Python 中,我们可以使用模块(Module)来组织和管理我们的代码。模块是 Python 中的一种组织代码的方式,可以将相关的代码放在一个模块中,方便重复使用和维护。但是当我们的代码变得越来越多时,单独使用模块已经不足以满足我们的需求了,这时候就需要使用包(Package)来组织我们的模块。
一个包其实就是一个目录,它包含了多个模块和子包。在包的目录下,我们需要创建一个名为 __init__.py
的文件,它可以是一个空文件,也可以包含一些初始化代码。这个文件告诉 Python 这个目录是一个包,可以被导入和使用。
下面我们通过一个例子来演示如何创建和使用自己的包。
创建包
假设我们要创建一个名为 my_package
的包,它包含了两个模块 module1
和 module2
。
首先,我们需要创建一个名为 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