包管理工具pip
简介
Pip 是安装python包的工具,提供了安装包,列出已经安装的包,升级包以及卸载包的功能。
Pip 是对easy_install的取代,提供了和easy_install相同的查找包的功能,因此可以使用easy_install安装的包也同样可以使用pip进行安装。
皮皮Blog
安装
python3或者anaconda自带pip
pip版本更新
pip3 install --upgrade pip
[Installation - pip documentation v23.3.dev0]
Pip的使用
安装package
$ pip install ***
更改pip源至国内镜像,显著提升下载速度:
pip install *** -i https://pypi.tuna.tsinghua.edu.cn/simple
清华大学的pip源,它是官网pypi的镜像,每隔5分钟同步一次。有的网站下载不下来,可以试试:--trusted-host pypi.sr。
豆瓣源:-i https://pypi.douban.com/simple/
pip通过whl安装:
pip install **.whl
pip install --force-reinstall
强制重装当前包,即使已是最新。Reinstall all packages even if they are already up-to-date.
-I, --ignore-installed
Ignore the installed packages (reinstalling instead).
重新安装需要更新的依赖:
pip install --upgrade
确保重新安装所有依赖,而不仅仅是那些需要更新的依赖:
pip install --upgrade --upgrade-strategy eager
安装出错
出错1:安装时候忽略某个依赖包
如更新tensorflow时报错:ERROR: Cannot uninstall 'wrapt'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
pip install -U --ignore-installed wrapt tensorflow
出错2:找不到要安装的包
pip install evaluate Looking in indexes: http://pypi.cross.pdd.net/simple ERROR: Could not find a version that satisfies the requirement evaluate (from versions: none) ERROR: No matching distribution found for evaluate
原因可能是python版本过低,或者安装在root下。重新下载anaconda可解决。
安装特定版本的package
通过使用==, >=, <=, >, <来指定一个版本号。
$ pip install 'Markdown<2.0'
$ pip install 'Markdown>2.0,<2.0.3'
升级包
升级包到当前最新的版本,可以使用-U 或者 --upgrade
$ pip install --upgrade ***
卸载包
$ pip uninstall Markdown
查询包/查看package详情说明
pip3 show scipy
会展示其依赖和常用的被依赖:
Name: scipy
Version: 1.3.0
Summary: SciPy: Scientific Library for Python
Home-page: https://www.scipy.org
Author: None
Author-email: None
License: BSD
Location: /Users/youzipi/anaconda3/lib/python3.6/site-packages
Requires: numpy
Required-by: seaborn, Keras
简单查看包
python -c "import torch;print(torch.__version__)"
列出安装的packages
方式1:pip list
方式2:pip list --format=freeze
方式3:pip freeze
不过自pip版本19.1后,pip freeze会生成@file:///URL这种形式的环境路径。
限制:pip生成的这种环境路径,仅支持在本地文件系统中使用,不能拷贝给他人使用
Note:包安装后的py文件路径:/usr/local/lib/python2.7/dist-packages
代码打包whl
setuptools是python自带的用来构建包的工具,构建出来的wheel(.whl)可供其他人pip install和import。
安装打包所需的库
pip install setuptools
pip install wheel
升级setuptools(如果遇到后面配置时find_packages找不到)
pip install --upgrade setuptools
流程
创建目录结构
helloworld
—__init__.py
—modeldir/
—code1.py
—main.py
setup.py
其中main.py
import torch
from .modeldir.model.model_util import ModelConfig
class Model():
@classmethod
def init(cls):
*** = load_config(model_path_name)
cls.model = loadTorchModel(model_path_name, ***)
@classmethod
def infer(cls, text):
return infer(text, ***)
def warm_up():
Model.init() # load模型及配置
Model.infer("这是一个测试") # 可以选择测试一条数据
def infer_forward(text, **kwargs):
return Model.infer(text) # 模型推理
if __name__ == '__main__': # 仅本地运行时有效。作为包import时无效。
warm_up()
print(infer_forward("这是一个测试"))
Note:
1 import同级目录时,需要from .进行相对引入。否则后面测试包时找不到modeldir。
2 读取同目录下文件时,要使用绝对路径,否则可能找不到。
real_dir = os.path.split(os.path.realpath(__file__))[0]
model_path_name = os.path.join(real_dir, model_path_name)
编辑__init__.py
这里是之后用这个包时候,from helloworld import *时,能import什么东西出来
可以是from helloworld import main
或者是from .main import *
__all__ = ['warm_up', 'infer_forward'] # 都是main.py中的函数
编辑setup.py
from setuptools import setup, find_packages
setup(name='helloworld',
version='0.0.1',
# description='helloworld!',
author='isme',
# author_email='helloworld@outlook.com',
# requires=['flask'], # 定义依赖哪些模块
packages=find_packages(), # 系统自动从当前目录开始找包
include_package_data=True,
# 如果有的包不用打包,则只能指定需要打包的文件
# packages=['main','modeldir','__init__'] #指定目录中需要打包的py文件,注意不要.py后缀。modeldir这种目录没测试过,应该也可以?
# license='apache 3.0'
)
Note:
name : 打包后包的文件名
version : 版本号
author : 作者
author_email : 作者的邮箱
py_modules : 要打包的.py文件
packages: 打包的python文件夹
include_package_data : 项目里会有一些非py文件,比如html和js等,这时候就要靠include_package_data 和 package_data 来指定了。package_data:一般写成{‘your_package_name’: [“files”]}, include_package_data还没完,还需要修改MANIFEST.in文件.MANIFEST.in文件的语法为: include xxx/xxx/xxx/.ini/(所有以.ini结尾的文件,也可以直接指定文件名)
license : 支持的开源协议
description : 对项目简短的一个形容
ext_modules : 是一个包含Extension实例的列表,Extension的定义也有一些参数。
ext_package : 定义extension的相对路径
requires : 定义依赖哪些模块
provides : 定义可以为哪些模块提供依赖
data_files :指定其他的一些文件(如配置文件),规定了哪些文件被安装到哪些目录中。如果目录名是相对路径,则是相对于sys.prefix或sys.exec_prefix的路径。如果没有提供模板,会被添加到MANIFEST文件中。
编辑MANIFEST.in文件
一般不需要也可以打包整个模型吧。
如果你需要将数据或者模型也打包,需要编辑MANIFEST.in文件(setup.py同级)
recursive-include helloword *
打包成whl文件
在程序根目录运行
rm -rf build dist *.egg-info #可以不用,会覆盖
python setup.py bdist_wheel
在dist目录下生成了打包文件:helloworld-0.0.1-py3-none-any.whl
测试包
pip安装whl文件
进入存放whl目录运行
pip install helloworld-0.0.1-py3-none-any.whl --force-reinstall
验证是否安装成功
python -c "import helloworld"
成功引入无报错即成功安装。
python -c "from helloworld import *; warm_up(); print(infer_forward('测试一个'))"
运行测试下结果,看下代码有没有错误。
其它(可不管)
pip打包成压缩文件
python setup.py sdist
安装压缩文件
解压压缩的文件进入setup.py所在目录,运行
python setup.py install