Loading... 凡是一个成熟的软件生态都有它的软件源和对应的包管理工具,Python 也不例外,pip 就是它的(官方推荐的)包管理工具。 pip 是目前最流行的 Python 包管理工具,它被当作 easy_install 的替代品,但是仍有大量的功能建立在 setuptools 之上。 easy_install 有很多不足:安装事务是非原子操作,只支持 svn,没有提供卸载命令, 安装一系列包时需要写脚本。pip 解决了以上问题,已经成为新的事实标准。 ```sh # 如果没有安装 pip,先安装 pip python get-pip.py # 升级 pip pip install --upgrade pip # 安装包(也可用于本地包的安装) pip install <package_name> pip install <package_name> --user # 安装到家目录 # 指定版本 pip install <package_name>==<version> # 升级包 pip install --upgrade SomePackage pip install -U SomePackage # 卸载包 pip uninstall SomePackage # 列出所有包 pip list pip list -o # 查看可升级的包 # 搜索包 pip search SomePackage # 查看包的完整信息 pip show -f SomePackage # 打包成轮子 pip wheel 包名 # 使用pip导出依赖文件列表 pip freeze > requirements.txt # 一般用 pipreqs 导出依赖 pip install pipreqs pipreqs . # 批量安装依赖包 # 某一包安装失败则全部终止 pip install -r requirements.txt pip install -r requirements.txt \ -i https://pypi.tuna.tsinghua.edu.cn/simple # 建议使用下面命令安装 while read requirement; do pip install $requirement; done < requirements.txt pip install --editable ./ # 以可编辑形式安装 # pip 安装本地包 pip install *.whl pip install *.tar.gz # conda 安装本地包 conda install --use-local *.tar.bz2 ``` requirements.txt 内容可以是 `~=`:版本号的前两个,最后一个版本号 要大于等于指定版本号 ```txt Django==1.11.2 requests>=2.11.0 -r web.txt simplejson ordereddict ``` ## 打包教程 [花了两天,终于把 Python 的 setup.py 给整明白了](https://zhuanlan.zhihu.com/p/276461821) [Python 库打包分发(setup.py 编写)简易指南](https://blog.konghy.cn/2018/04/29/setup-dot-py/) ### find_packages 它默认在与 setup.py 文件同一目录下搜索各个含有 `__init__.py` 的目录做为要添加的包 ```python from setuptools import setup setup( name='demo', # 包名字 version='1.0', # 包版本 description='This is a test of the setup', # 简单描述 author='huoty', # 作者 author_email='sudohuoty@163.com', # 作者邮箱 url='https://www.konghy.com', # 包的主页 packages=['demo'], # 包 ) ``` ## Python 包管理工具 在安装 Python 包的过程中,经常涉及到 `distutils、setuptools、distribute、setup.py、easy_install、easy_install 和 pip` 等等。 ### distutils distutils 是包分发的始祖 `istutils` 是 `python` 标准库的一部分,这个库的目的是为开发者提供一种方便的打包方式, 同时为使用者提供方便的安装方式。 我们经常使用的 `setup.py` 就是基于 `distutils` 实现的,然后通过 `setup.py` 就可以进行打包或者安装了。 看一个简单的例子,找一个目录创建三个文件 `foo.py`、`bar.py` 和 `setup.py`,其中 `setup.py` 的内容如下: ```py from distutils.core import setup setup( name='fooBar', version='1.0', author='Will', author_email='wilber@sh.com', url='http://www.cnblogs.com/wilber2013/', py_modules=['foo', 'bar'], ) ``` ```sh python setup.py sdist # 得到 fooBar-1.0.zip 的包 unzip *.zip # 解压缩这个包 python setup.py install # 安装自定义包 ``` 关于更过如何编写 `setup.py` 的内容,请自行参阅 Python 官方文档中的 [setupscript](https://docs.python.org/2/distutils/setupscript.html) 部分。 ### setuptools 及其分支 distribute setuptools/distribute 都扩展了 distutils,提供了更多的功能 **setuptools 是对 distutils 的增强**,尤其是引入了包依赖管理。我们可以通过 **`ez_setup.py`** 来安装 setuptools。 至于 distribute,它是 setuptools 的一个分支版本。分支的原因是有一部分开发者认为 setuptools 开发太慢。但现在,distribute 又合并回了 setuptools 中,所以可以认为它们是同一个东西。 前面看到 setup.py 可以创建一个压缩包,而 setuptools 使用了一种新的文件格式(.egg),可以为 Python 包创建 egg 文件。setuptools 可以识别.egg 文件,并解析、安装它 #### easy_install 当安装好 setuptools/distribute 之后,我们就可以直接使用 easy_install 这个工具了 easy_install 是基于 setuptools/distribute 的一个工具,方便了包的安装和升级 ```sh # 自动从 PyPI 上下载相关的包,并完成安装,升级 easy_install package # 本地安装一个包 easy_install package.tgz # 安装 egg 格式的包 easy_install package.egg ``` ## Python 模块和包管理 ### 模块和包 - 在 Python 中每一个 `.py` 都可以视作一个模块(module),而每一个包含 `__init__.py` 的目录则可以视作包(packge)。 - 加载某个模块后,会出现新目录`__pycache__` ,这是编译后中间文件,可以提升模块载入速度。 ### `__init__.py` 文件 这里的 `__init__.py` 每当导入当前包的模块的时候就会运行一次 相对路径和绝对路径引用 上面有使用类似这种带有相对路径的导入路径 `from .XXX`,这种代表从当前的 `XXX` 模块中导入名称。如果想要在 `packs/two/two.py` 中使用上一层的 `packs/one.py` 就可以使用 `from ..one import One` 的方式。 ### 模块搜索顺序 自己写的包名肯定可能和第三方或者标准库同名,不过这种同名通常没有问题。因为 python 会优先在当前目录搜索然后在环境变量的搜索路径,之后才是标准库和第三方包。 这个和 linux $PATH 的环境变量一样,按照顺序来搜索。一旦导入每个模块就有全局的命名空间,第二次再次加载就会使用缓存。 这个路径搜索方式和 nodejs 有些区别,nodejs 是一旦同名,优先标准库,如果自定义一个 http 模块,那么永远不会被加载。 ## 参考 [Python 包管理工作流](https://frostming.com/2018/09-14/python-packaging-flow/) [Python 模块和包管理](https://islishude.github.io/blog/2019/06/29/python/Python%E6%A8%A1%E5%9D%97%E5%92%8C%E5%8C%85%E7%AE%A1%E7%90%86/) [Python 的包管理器 (1):包管理器介绍与 Pypi 入门指南](https://zhuanlan.zhihu.com/p/66283928) [Python 之包管理工具](https://www.cnblogs.com/wilber2013/p/4769467.html) 最后修改:2022 年 01 月 18 日 06 : 32 PM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信