有的时候,我们需要对自己写的项目生成一个requeirments.txt,方便其他使用者快速安装依赖项

参考https://www.cnblogs.com/shun7man/p/14080921.html

1.使用pip

如果你的项目本身就是在venv虚拟环境下跑的,那么可以直接用下面的语句生成一个依赖项文件

1
pip freeze > requirements.txt

image-20230117103932036

但如果你和我一样,没有使用虚拟环境,而是用全局的包的话,那就会出现上图的情况,生成的txt文件里面出现了太多本项目没有用到的包,那你让别人安装那么多没有用的包,岂不是坑人嘛!

所以可以用另外一个项目来解决这个问题

2.pipreqs

安装

项目地址 https://github.com/bndr/pipreqs

使用之前需要先安装一个包

1
pip install pipreqs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[muxue@bt-7274:~/kook/val-bot]$ pip3.10 install pipreqs
Defaulting to user installation because normal site-packages is not writeable
Collecting pipreqs
Downloading pipreqs-0.4.11-py2.py3-none-any.whl (32 kB)
Collecting yarg
Downloading yarg-0.1.9-py2.py3-none-any.whl (19 kB)
Collecting docopt
Downloading docopt-0.6.2.tar.gz (25 kB)
Preparing metadata (setup.py) ... done
Requirement already satisfied: requests in /home/muxue/.local/lib/python3.10/site-packages (from yarg->pipreqs) (2.28.1)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /home/muxue/.local/lib/python3.10/site-packages (from requests->yarg->pipreqs) (1.26.11)
Requirement already satisfied: idna<4,>=2.5 in /home/muxue/.local/lib/python3.10/site-packages (from requests->yarg->pipreqs) (3.3)
Requirement already satisfied: certifi>=2017.4.17 in /home/muxue/.local/lib/python3.10/site-packages (from requests->yarg->pipreqs) (2022.6.15)
Requirement already satisfied: charset-normalizer<3,>=2 in /home/muxue/.local/lib/python3.10/site-packages (from requests->yarg->pipreqs) (2.1.1)
Installing collected packages: docopt, yarg, pipreqs
DEPRECATION: docopt is being installed using the legacy 'setup.py install' method, because it does not have a 'pyproject.toml' and the 'wheel' package is not installed. pip 23.1 will enforce this behaviour change. A possible replacement is to enable the '--use-pep517' option. Discussion can be found at https://github.com/pypa/pip/issues/8559
Running setup.py install for docopt ... done
Successfully installed docopt-0.6.2 pipreqs-0.4.11 yarg-0.1.9

使用

安装完成后,使用下面的语句来生成文件

1
pipreqs . --encoding=utf8 --force

这个语句的意思是生成当前目录的项目所用到的包的requirements文件

image-20230117104324080

可以看到,用这个项目生成的文件,包少多了,且确实是本项目需要用到的!

3.创建venv虚拟环境进行测试

为了方便进行测试,这里我以创建一个新的python虚拟环境为例

3.1 创建虚拟环境

先来吧项目的代码复制到一个新的文件夹,创建一个虚拟环境

1
python -m venv botest

这会在当前目录下创建一个botest文件夹

此时我们使用pip list查看当前环境下安装了什么包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
[muxue@bt-7274:~/kook/test]$ pip3.10 list
Package Version
---------------------- -----------
aiofiles 0.8.0
aiohttp 3.8.1
aiosignal 1.2.0
aliyun-python-sdk-core 2.13.36
aliyun-python-sdk-kms 2.16.0
APScheduler 3.9.1
async-timeout 4.0.2
attrs 22.1.0
certifi 2022.6.15
cffi 1.15.1
charset-normalizer 2.1.1
click 8.1.3
colorama 0.4.6
crcmod 1.7
cryptography 38.0.2
docopt 0.6.2
Flask 2.2.2
frozenlist 1.3.1
h11 0.14.0
idna 3.3
itsdangerous 2.1.2
Jinja2 3.1.2
jmespath 0.10.0
khl.py 0.3.7
MarkupSafe 2.1.1
multidict 6.0.2
numpy 1.24.1
oss2 2.16.0
pandas 1.5.2
Pillow 9.2.0
pip 22.3.1
pipreqs 0.4.11
pycparser 2.21
pycryptodome 3.15.0
pycryptodomex 3.15.0
python-dateutil 2.8.2
pytz 2022.2.1
pytz-deprecation-shim 0.1.0.post0
requests 2.28.1
riot-auth 1.0.3
setuptools 63.2.0
six 1.16.0
tzdata 2022.2
tzlocal 4.2
urllib3 1.26.11
uvicorn 0.18.3
valorant 1.0.4
Werkzeug 2.2.2
yarg 0.1.9
yarl 1.8.1
zhconv 1.4.3

你会发现还是有很多包啊?这是因为我们只创建了虚拟环境,还没有启动它!

3.2 启动/关闭虚拟环境

用下面的命令启动

1
2
[muxue@bt-7274:~/kook/test]$ source botest/bin/activate
(botest) [muxue@bt-7274:~/kook/test]$

如果是windows,要用如下命令

1
./botest/Scripts/activate

你会发现命令行前面多了一个(botest),这就代表我们的虚拟环境启动成功了

1
2
3
4
5
(botest) [muxue@bt-7274:~/kook/test]$ pip3.10 list
Package Version
---------- -------
pip 22.2.1
setuptools 63.2.0

再次执行,发现只剩下两个默认的包了,这才是对的!

要想退出虚拟环境,用下面的语句即可

1
deactivate

3.3 测试

代码拷贝过来了,假设我们现在就是一个刚刚克隆了此仓库,要使用项目的程序猿

此时我们需要利用requirements.txt快速安装需要的包

1
pip install -r requirements.txt

他会开始一个个安装所需要的包,以及这些包所需要的依赖项;和我们手动安装包是一个效果

image-20230117105528601

随后就出现了一个意料之中的报错

image-20230117105700120

这是因为riot_auth这个包,并没有在pypi里面注册,其安装的方式是用git安装的

1
pip3.10 install git+https://github.com/floxay/python-riot-auth.git

使用pip freeze创建出来的txt文件里面的依赖项,才是正确的包

1
riot-auth @ git+https://github.com/floxay/python-riot-auth.git@e70f76002728b99005baccd6fe3157c03d4d9f02

这也是我目前发现的该项目的一个bug,已经提交了issue了!

https://github.com/bndr/pipreqs/issues/350

既然知道问题的情况,那就手动弄一下吧!不过需要提醒的是,这种git方式的pip包经常安装不上,会报下面的错误

image-20230117110626755

个人猜测和github的网络环境也有关系,所以得多试几次,或者手动克隆,粘贴到本地.site-packages源码里面

如果一切顺利的话,那应该是能安装完成的!此时就可以愉快的运行项目代码了