有的时候,我们需要对自己写的项目生成一个requeirments.txt
,方便其他使用者快速安装依赖项
1.使用pip
如果你的项目本身就是在venv虚拟环境下跑的,那么可以直接用下面的语句生成一个依赖项文件
pip freeze > requirements.txt
但如果你和我一样,没有使用虚拟环境,而是用全局的包的话,那就会出现上图的情况,生成的txt文件里面出现了太多本项目没有用到的包,那你让别人安装那么多没有用的包,岂不是坑人嘛!
所以可以用另外一个项目来解决这个问题
2.pipreqs
项目地址 https://github.com/bndr/pipreqs
使用之前需要先安装一个包
pip install pipreqs
[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
安装完成后,使用下面的语句来生成文件
pipreqs . --encoding=utf8 --force
这个语句的意思是生成当前目录的项目所用到的包的requirements文件
可以看到,用这个项目生成的文件,包少多了,且确实是本项目需要用到的!
3.创建venv虚拟环境进行测试
3.1 创建
先来吧项目的代码复制到一个新的文件夹,创建一个虚拟环境
python -m venv botest
这会在当前目录下创建一个botest文件夹
此时我们使用pip list
查看当前环境下安装了什么包
[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 启动/关闭虚拟环境
用下面的命令启动
[muxue@bt-7274:~/kook/test]$ source botest/bin/activate
(botest) [muxue@bt-7274:~/kook/test]$
你会发现命令行前面多了一个(botest)
,这就代表我们的虚拟环境启动成功了
(botest) [muxue@bt-7274:~/kook/test]$ pip3.10 list
Package Version
---------- -------
pip 22.2.1
setuptools 63.2.0
再次执行,发现只剩下两个默认的包了,这才是对的!
要想退出虚拟环境,用下面的语句即可
deactivate
3.3 测试
代码拷贝过来了,假设我们现在就是一个刚刚克隆了此仓库,要使用项目的程序猿
此时我们需要利用requirements.txt
快速安装需要的包
pip install -r requirements.txt
他会开始一个个安装所需要的包,以及这些包所需要的依赖项;和我们手动安装包是一个效果
随后就出现了一个意料之中的报错
这是因为riot_auth
这个包,并没有在pypi里面注册,其安装的方式是用git安装的
pip3.10 install git+https://github.com/floxay/python-riot-auth.git
使用pip freeze
创建出来的txt文件里面的依赖项,才是正确的包
riot-auth @ git+https://github.com/floxay/python-riot-auth.git@e70f76002728b99005baccd6fe3157c03d4d9f02
这也是我目前发现的该项目的一个bug,已经提交了issue了!
既然知道问题的情况,那就手动弄一下吧!不过需要提醒的是,这种git方式的pip包经常安装不上,会报下面的错误
个人猜测和github的网络环境也有关系,所以得多试几次,或者手动克隆,粘贴到本地.site-packages
源码里面
如果一切顺利的话,那应该是能安装完成的!此时就可以愉快的运行项目代码了