可是稍微了解了一下后发现其实 Python 不止能当脚本语言来用。基于一定的工具链,Python 也能写出漂亮标准的项目代码、将环境和依赖理的明明白白。
基于PIP最基础的依赖管理应当能解决如下问题:
明确知道当前项目依赖了哪些第三方的包,以及他们的依赖树。 这些功能使用 Pip 工具链其实是能很方便做到的。
快速配置环境(pip) 想简单预览当前环境下的依赖包可以直接用 pip list
命令:
$ pip list Package Version ---------- ------------------- certifi 2020.6.20 pip 19.3.1 setuptools 44.0.0.post20200106 wheel 0.36.2
对于一个空的 Python 环境,基础一般只会有这四个包。我们这样就知道了当前环境中有哪些包,以及他们的版本。
为了方便说明,我们先多引一些依赖 pip install flask
。
$ pip list Package Version ------------ ------------------- certifi 2020.6.20 click 7.1.2 Flask 1.1.2 itsdangerous 1.1.0 Jinja2 2.11.3 MarkupSafe 1.1.1 pip 19.3.1 setuptools 44.0.0.post20200106 Werkzeug 1.0.1 wheel 0.36.2
安装了 Flask 之后,我们发现除了 Flask 他还多引入了好多个间接依赖。
如果想要将这个信息记录下来,我们可以用 pip freeze
命令,记在 requirements.txt 中(一个约定俗成的名字)。
$ pip freeze > requirements.txt $ cat requirements.txt certifi==2020.6.20 click==7.1.2 Flask==1.1.2 itsdangerous==1.1.0 Jinja2==2.11.3 MarkupSafe==1.1.1 Werkzeug==1.0.1
好了,记下这个文件,以后我们如果需要在一个新的 Python 环境中引入当前的依赖,只需要使用 pip install -r requirements.txt
即可。
明确项目依赖(pipdeptree) pip list
或 pip freeze
打印出来的依赖有一个问题,就是并没有明确依赖关系。这样的坏处是,当我们想清理依赖的时候,就不知道到底哪些依赖是能被直接删除的、哪些依赖又是被间接依赖而不能轻易删除的。
例如我们可能在项目中用了 Flask ,但是我们可能不知道 Flask 也引用了 Jinja2 。这是我们如果擅自删除了 Jinja2 ,项目就可能跑不起来。。。
这时就可以使用 pipdeptree 工具来管理依赖树:
$ pip install pipdeptree ... $ pipdeptree certifi==2020.6.20 Flask==1.1.2 - click [required: >=5.1, installed: 7.1.2] - itsdangerous [required: >=0.24, installed: 1.1.0] - Jinja2 [required: >=2.10.1, installed: 2.11.3] - MarkupSafe [required: >=0.23, installed: 1.1.1] - Werkzeug [required: >=0.15, installed: 1.0.1] pipdeptree==2.0.0 - pip [required: >=6.0.0, installed: 19.3.1] setuptools==44.0.0.post20200106 wheel==0.36.2
现在我们就知道了,原来 Jinja2 是被 Flask 依赖的,这样我们就不会随便删除了。。。
项目依赖治理(pip-autoremove) 那么问题来了,如果我忽然不想依赖 Flask 了,我们需要怎么做呢?
无脑的做法是 pip uninstall flask -y
。不那么显然的是,这其实不够优雅:
$ pip uninstall flask -y ... $ pipdeptree certifi==2020.6.20 click==7.1.2 itsdangerous==1.1.0 Jinja2==2.11.3 - MarkupSafe [required: >=0.23, installed: 1.1.1] pipdeptree==2.0.0 - pip [required: >=6.0.0, installed: 19.3.1] setuptools==44.0.0.post20200106 Werkzeug==1.0.1 wheel==0.36.2
发现没,Flask 虽然被卸载了,但是他的依赖包并没有卸载干净。你可能需要重新一个一个判断你是否需要剩下的包,然后再递归删除。。。
幸运的是,我们就可以用 pip-autoremove 工具来做这件事。我们重新安装Flask,再用这个工具删除试试:
$ pip install flask $ pip install pip-autoremove $ pip-autoremove flask -y $ pipdeptree certifi==2020.6.20 pip-autoremove==0.9.1 pipdeptree==2.0.0 - pip [required: >=6.0.0, installed: 19.3.1] setuptools==44.0.0.post20200106 wheel==0.36.2
这下干净了😊。
基于Condapip 能基本解决单一项目的环境处理问题。但是由于 Python 是全局环境,如果有多个项目,我们就无法区分项目维度的依赖。解决这个问题一般有两个思路,一个是像 Node.js 一样用 package.json 配置文件支持项目维度的环境隔离,另一个就是走 rvm、nvm的思路用虚拟环境隔离。目前看 Python 只能支持后者,也就是用基于 Conda 的虚拟环境。
值得一提的是,conda 虽然为Python 而生,但他其实是一个通用的虚拟环境工具。他的官网写的很清楚:
Package, dependency and environment management for any language---Python, R, Ruby, Lua, Scala, Java, JavaScript, C/ C++, FORTRAN
Conda is an open-source package management system and environment management system that runs on Windows, macOS, and Linux. Conda quickly installs, runs, and updates packages and their dependencies. Conda easily creates, saves, loads, and switches between environments on your local computer. It was created for Python programs but it can package and distribute software for any language.
很强大,有多强大,可以将不同语言的依赖环境整合在一起的强大。
安装 Conda 官网给了两个发行版本,一个是 Anaconda ,一个是 Miniconda。Anaconda 相比 Miniconda 主要是多预装了很多科学计算的库,而我更喜欢按需使用不喜欢全家桶,所以我选 Miniconda。
官网下载miniconda3,并执行安装脚本。
安装后会发现 .bashrc 下多了几行:
# >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! __conda_setup="$('/home/zhenping/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null) " if [ $? -eq 0 ]; then eval "$__conda_setup " else if [ -f "/home/zhenping/miniconda3/etc/profile.d/conda.sh" ]; then . "/home/zhenping/miniconda3/etc/profile.d/conda.sh" else export PATH="/home/zhenping/miniconda3/bin:$PATH " fi fi unset __conda_setup# <<
重新登录,或着手动执行 source ~/.bashrc
,以加载conda命令。
现在就会发现提示符前多了默认环境 (base),表示当前启用了默认环境 base 。
如果不想在会话启动时就开启conda环境,就执行 conda config --set auto_activate_base false
。
环境操作 创建一个纯净的 Python2.7 环境,名字姑且叫 frida ,并激活该环境。
$ conda create -n frida python=2.7 -y ... $ conda activate frida
需要注意的是,创建环境之后,一定要 activate 该环境,否则后续的 install 操作还是在 base 环境。。。
查看已有环境列表:
(frida) $ conda env list# conda environments: # base /home/myths/miniconda3 frida * /home/myths/miniconda3/envs/frida
查看当前环境下的依赖:
(frida) $ conda list# packages in environment at /home/myths/miniconda3/envs/frida: # # Name Version Build Channel _libgcc_mutex 0.1 main ca-certificates 2021.4.13 h06a4308_1 certifi 2020.6.20 pyhd3eb1b0_3 libffi 3.3 he6710b0_2 libgcc-ng 9.1.0 hdf63c60_0 libstdcxx-ng 9.1.0 hdf63c60_0 ncurses 6.2 he6710b0_1 pip 19.3.1 py27_0 python 2.7.18 h15b4118_1 readline 8.1 h27cfd23_0 setuptools 44.0.0 py27_0 sqlite 3.35.4 hdfb4753_0 tk 8.6.10 hbc83047_0 wheel 0.36.2 pyhd3eb1b0_0 zlib 1.2.11 h7b6447c_3
我们发现,与 pip list
只展示 Python 包不同,conda list
还展示了对其他语言项目代码的依赖。
退出环境:
(frida) $ conda deactivate
这里需要注意,conda 的环境是可以默认嵌套两层的,因此 deactivate 的时候要看清楚了,可能要 deactivate 两次才能真正退出 Conda 。
依赖管理 Conda 也有和 pip freeze
类似的依赖管理方式:
为当前环境创建配置文件:
(frida) $ conda env export > environment.yaml (frida) $ cat environment.yaml name: frida channels: - defaults dependencies: - _libgcc_mutex=0.1=main - ca-certificates=2021.4.13=h06a4308_1 - certifi=2020.6.20=pyhd3eb1b0_3 - libffi=3.3=he6710b0_2 - libgcc-ng=9.1.0=hdf63c60_0 - libstdcxx-ng=9.1.0=hdf63c60_0 - ncurses=6.2=he6710b0_1 - pip=19.3.1=py27_0 - python=2.7.18=h15b4118_1 - readline=8.1=h27cfd23_0 - setuptools=44.0.0=py27_0 - sqlite=3.35.4=hdfb4753_0 - tk=8.6.10=hbc83047_0 - wheel=0.36.2=pyhd3eb1b0_0 - zlib=1.2.11=h7b6447c_3 prefix: /home/myths/miniconda3/envs/frida
根据配置文件复现当前环境:
$ conda env create -f environment.yaml
IDE集成 使用 conda 还有个很大的好处就是和 IDE 可以非常方便的集成。
一些思考用Conda做其他语言的虚拟环境方便么?
现在看起来非常方便,几乎所有需要区分全局环境的地方都可以用。比如 Java 环境:
$ conda create -n java8 $ conda activate java8 $ conda install openjdk=8.0.152 -y $ conda list# packages in environment at /home/myths/miniconda3/envs/java8: # # Name Version Build Channel openjdk 8.0.152 h7b6447c_3
同时,我们也可以在这个环境中集成 Node 环境,Python 环境,Ruby环境,甚至集成一些 curl、wget 等常用命令,非常方便。这对于一些跨语言、跨环境项目的环境搭建可是太有帮助了。。。
如何找conda支持的包呢?
可以直接用 conda search xxx
来搜索。不过这样可能不太全,我们也可以在 https://anaconda.org/search?q=openjdk 这里根据关键字搜索,当然也可以向这里贡献。
安装 Python 包是用 conda 好还是用 pip 好?
如果明确是纯粹的 python 包,还是建议用 pip install 安装,方便用 pip 统一管理。对于跨语言的、或者是本身就整合了各种依赖的环境(比如 tenserflow),再考虑用 conda install。
参考anaconda-vs-miniconda conda官方文档 Pip-deptree Pip-autoremove
作者:Mythsman 原文链接:https://blog.mythsman.com/post/6088206570684f526e6bc606/
为了跟上AI时代我干了一件事儿,创立了一个ChatGPT星球,想带着大家一起探索ChatGPT和新的AI时代。
ChatGPT 的风口正到来!作为我们普通人,为了跟上时代,更应该马上行动,真正了解并熟练使用 ChatGPT。未来围绕着 ChatGPT 将会涌现出无数多的机会。我们一定要在这个领域内做点事情。如果在这个新的技术浪潮中,抓住一点点小的机会,那给我们人生带来的改变必然是巨大的!
我相信有很多人没有 ChatGPT 的账号,或许连注册都不太会。跟着我们一起学习,这些方法我们都会手把手交给你!
目前我们星球 200 多人了,球友们都成功注册了,目前知道的可以通过一些特殊的邮箱和成功注册到 GPT 的账号!你一个人单打独斗玩 GPT 会遇到很多问题,费时费力,需要抱团取暖,才能走的更远!
如果你想快速上手、熟练应用 ChatGPT,获取第一首关于 ChatGPT 的资料,利用 ChatGPT 提升工作效率,获取 ChatGPT 变现机会等。请务必加入知识星球:ChatGPT 研究院。今天加入星球的小伙伴,直接送 ChatGPT 独立账户(数量有限) !
入球福利:
考虑到很多小伙伴搞不定 ChatGPT 账号的问题,我们决定,凡是今天加入 ChatPGT 研究院的小伙伴,我们都会直接送一个 ChatGPT 独立账户。
这个星球能够为你提供什么服务呢?
1、ChatGPT 基础用法:账号注册、使用教程、基本玩法、提问技巧。
2、ChatGPT 前沿资讯、第一首资料、开源项目。
3、交流共享 ChatGPT 的各种信息,资源互换,答疑关于 ChatGPT 的问题。
4、分享如何利用 ChatGPT 提升工作效率,分享变现机会。
5、凡是今天加入星球都有一项重磅福利:免费获得 ChatGPT 独立账号一个。
我们第一期的定价是 198 元一年,这两天星球在试运营阶段,我们给出了加入的最低价 158 ,后面随着星球人数的增长,星球费用也会随之增长(破 1000 人涨价 10 元)。建议大家尽早以便宜的价格加入哦!
感兴趣的朋友们,欢迎扫码加入本星球:
机不可失失不再来!希望大家能在 2023 年抓住 ChatGPT 的风口,持续进步!
点击上方名片,回复「ChatGPT」获取一份ChatGPT白皮书