首页 Python导出项目依赖
文章
取消

Python导出项目依赖

前言

  在Python开发中,经常会遇到环境问题,不同版本的python,不同的依赖关系等等,之前写过一篇《conda安装与使用》,主要说的是如何切换不同的python版本及管理相关依赖,其中也涉及到环境的导出和导入。

环境管理

conda

  Conda 是一个开源的软件包管理系统和环境管理系统,不管可以管理python的依赖,还能管理python的版本。使用起来很强大,毕竟不管是python版本还是依赖及依赖的版本都可以管理,但是他有一个缺点,他导出的是虚拟环境下的python版本及所有安装的依赖,有时候我们项目并不需要那么多依赖,就要手动删除一些依赖,这点比较麻烦。

1
2
3
4
5
# 导出当前虚拟环境
conda env export > environment.yml
# 导入
conda env create -f environment.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
## 它导出的是这个样子
name: base # 虚拟环境名
channels:
  - defaults
dependencies:
  - aext-assistant=4.0.15=py310hecd8cb5_jl4_0
  - aext-assistant-server=4.0.15=py310hecd8cb5_0
  - aext-core=4.0.15=py310hecd8cb5_jl4_0
# ......此处删除几百行,这里不是随便删的,后面会讲到
  - zlib=1.2.13=h4dc903c_0
  - zstandard=0.19.0=py310h6c40b1e_0
  - zstd=1.5.5=hc035e20_0
  - pip:
      - chardet==3.0.4
      - funppy==0.5.0
      - googletrans==4.0.0rc1
      - grpcio==1.56.2
# ......此处删除好多行,这里不是随便删的,后面会讲到
      - protobuf==4.23.4
      - rfc3986==1.5.0
prefix: /Users/mmy83/anaconda3
# 导入的时候,他会自动安装所有依赖

pip freeze

  pip作为python的包管理工具,也可以导出当前项目依赖。但是他不会管理python的版本,而且他和conda一样,会把当前环境下的所有安装的包都导出。也需要针对项目手动删除一些依赖。

1
pip freeze > requirements.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 导出当前环境的依赖是这个样子

aext-assistant @ file:///private/var/folders/c_/qfmhj66j0tn016nkx_th4hxm0000gp/T/abs_24994515xd/croot/aext-assistant_1717062163042/work
aext-assistant-server @ file:///private/var/folders/sy/f16zz6x50xz3113nwtb9bvq00000gp/T/abs_4boob09gv8/croot/aext-assistant-server_1717059973985/work
aext-core @ file:///private/var/folders/sy/f16zz6x50xz3113nwtb9bvq00000gp/T/abs_3etmw5tx6d/croot/aext-core_1717056386167/work
# ......此处删除几百行
chardet==3.0.4
# ......此处删除好多行
funppy==0.5.0
future @ file:///private/var/folders/sy/f16zz6x50xz3113nwtb9bvq00000gp/T/abs_27i98bxita/croot/future_1677599886956/work
googletrans==4.0.0rc1
grpcio==1.56.2
grpcio-tools==1.56.2
# ......此处删除几百行
protobuf==4.23.4
# ......此处删除几百行
zstandard @ file:///private/var/folders/sy/f16zz6x50xz3113nwtb9bvq00000gp/T/abs_40ayfv1xn6/croot/zstandard_1677014126754/work
# 导入的时候,会有问题,因为这里面有很多是绝对路径,而不是版本

pip list –format=freeze

1
pip list --format=freeze > requirements.txt 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 导出当前环境的依赖是这个样子
aext-assistant==4.0.15
aext-assistant-server==4.0.15
aext-core==4.0.15
aext-core-server==4.0.15
aext-panels==4.0.15
aext-panels-server==4.0.15
aext-share-notebook==4.0.15
aext-share-notebook-server==4.0.15
aext-shared==4.0.15
anaconda-anon-usage==0.4.3
anaconda-client==1.12.2
anaconda-cloud-auth==0.5.1
anaconda-navigator==2.6.1
anaconda-project==0.11.1
# ......此处删除几百行
zipp==3.17.0
zstandard==0.19.0

和conda的对比一下会发现:

1、pip导出的依赖不光可以有版本号还可以有绝对路径,而conda导出的依赖是版本。

2、pip导出的比conda导出的少,少的原因是这里面有的依赖不是pip能管理的,但是conda却可以管理,如:zlib。这也说明了conda的强大。

3、这两个都是环境级别的,他会把当前环境的依赖全导出。

4、conda里面是有python版本的(样例中删掉了),pip中没有,这也是因为pip管理不了python版本,而conda可以。

pipreqs

  pipreqs是一个python的依赖导出工具,它支持导出当前项目的依赖,并且支持指定路径。

1
2
pip install pipreqs 
pipreqs /path/to/project --encoding=utf8 --force
1
2
3
4
5
6
7
8
9
10
11
12
13
# 导出当前环境的依赖是这个样子
ftfy==6.2.0
numpy==2.0.0
packaging==24.1
Pillow==10.0.1
Pillow==10.4.0
pytest==8.2.2
regex==2024.5.15
setuptools==68.2.2
torch==2.3.1
torchvision==0.18.1
tqdm==4.65.0
# 这是全部,没有删,可以看到少了很多,因为pipreqs只支持导出当前项目的依赖

  pipreqspip freeze的区别是,pipreqs只支持导出当前项目的依赖,而pip freeze会导出当前环境的所有依赖。

本文由作者按照 CC BY 4.0 进行授权

Pytorch中的广播机制Broadcast

IPython使用技巧