setuptools打包与安装
# setuptools 打包
要打包 Python 脚本, 你可以使用 Python 的内置模块 distutils 或第三方模块 setuptools。这些工具可用于创建可分发的 Python 软件包, 以便其他人可以轻松安装和使用你的脚本
下面的例子也是基于 setuptools 展开
setuptools: Easily download, build, install, upgrade, and uninstall Python packages. 更多内容请参阅官方文档 (opens new window)
# 打包
下面是使用 setuptools 工具 创建 Python 脚本的示例:
1.确保你的项目目录结构如下所示:
my_script/
|-- setup.py
|-- my_script/
|-- __init__.py
|-- script.py
2
3
4
5
2.在项目根目录下创建 setup.py 文件, 并添加以下内容:
from setuptools import setup
setup(
name='my_script',
version='1.0',
packages=['my_script'],
install_requires=[
],
entry_points={
'console_scripts': [
'aaa = my_script.script:main'
]
}
)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
在 setup 函数中, 你需要指定包的名称、版本号、包含的模块等信息
install_requires参数用于指定项目的依赖项, 这些依赖项将在安装项目时自动安装entry_points部分用于将你的脚本与可执行命令关联起来
通过上面的配置打包后, 当你安装软件包并在终端中运行 aaa 命令时, 将执行 my_script.script 模块中的 main 函数
3.在 my_script 目录下创建 __init__.py 文件, 可以留空
4.在 my_script 目录下创建你的 Python 脚本文件 script.py, 并添加你的脚本代码。例如:
def main():
print("Hello, World!")
if __name__ == '__main__':
main()
2
3
4
5
6
5.打开终端, 导航到项目根目录, 并运行以下命令来构建软件包:
python setup.py sdist
这将在 dist 目录中生成一个压缩文件, 其中包含你的软件包
6.如果你希望其他人能够使用 pip 命令安装你的软件包, 可以将软件包上传到 PyPI 或创建一个本地仓库。要上传到 PyPI, 请按照官方文档中的说明进行操作。如果要创建本地仓库, 可以使用工具如 devpi 或 twine
# 安装
经过上面的流程后安装包位置在 ./dist/my_script-1.0.tar.gz. 通过 pip3 命令安装
pip3 install dist/my_script-1.0.tar.gz
# 强制重新安装
pip3 install dist/my_script-1.0.tar.gz --force-reinstall
2
3
之后应该就可以正常上使用上面的 aaa 命令了
# 概念
# __init__.py文件
在 Python 中, __init__.py是一个特殊的文件, 用于标识一个目录作为 Python 包。当一个目录中包含了__init__.py文件时, Python 会将该目录视为一个包, 并可以通过导入该包来访问其中的模块和资源
以下是__init__.py文件的一些常见用途:
- 声明包级别的初始化代码: 你可以在
__init__.py文件中编写一些需要在导入包时执行的初始化代码。这些代码可以包括变量初始化、设置环境、导入子模块等 - 导入模块: 在
__init__.py文件中, 你可以导入该包下的模块, 使得在导入包时可以直接访问这些模块。这样, 在导入包时, 你可以使用更方便的包级别导入方式, 而不需要逐个导入每个模块 - 定义包的接口:
__init__.py文件可以作为包的接口, 提供外部使用该包时的接口定义。你可以在该文件中选择性地导入并重新导出包内的模块、类、函数等, 从而控制外部对包的可见性
需要注意的是, __init__.py文件并非必需的。在 Python 3.3 及以上的版本中, 如果你的目录仅作为包的容器而不包含额外的初始化代码或接口定义, 可以省略__init__.py文件。在这种情况下, Python 仍会将目录视为包, 但它将是一个隐式的包
总之, __init__.py文件是用于标识一个目录作为 Python 包的文件, 在其中可以编写初始化代码、导入模块以及定义包的接口