Pythonic手账

等待填坑

碎碎念

2020年了,python2该退休了(真是不太想再看到python2了,祖传依赖令人头大)

安利包管理工具poetry,试了都说好

python3.8怕是串了Go和C++的味,算了,真香

python多版本管理

python的包管理是个很混乱的事, 一般单版本基本上没事,但是装了N个版本,甚至还有python2,麻烦就来了,一不小心就被坑,尤其是在大家都用的服务器上。(这上面有2.7,3.5,3.6和师兄炼丹装的conda3.7、3.6,不要问我为什么linux装conda,师兄干的)

我用自己的linux用户可以避开root用户底下一些混乱环境(比如conda) 主要的问题是切换python版本和python包管理,切换python版本一般用pyenv;包管理选择很多,一直没发现特别完美的工具。直到,发现了Poetry

pyenv

pyenv用来切换python版本,配合其他工具管理包

venv和virtualvenv

venv是python3官方的包管理工具,virtualvenv兼容py2、3,这两个感觉用的最多了,看到别人的很多项目都用的这个,pycharm默认也是这玩意 没什么特殊需求就用这个吧

pipenv

一个类似Ruby的Bundler的东西 纯指定依赖,使用体验比上面那个好,有一点慢 (不推荐在win上用)

就跟npm差不多,和node_modules差不多的Pipfile(存放本地包),和npm的package-lock.json差不多的Pipfile.lock(版本锁)

但是,这家伙会趁你不注意偷偷更新你的依赖。注意不要被它的自动更新坑了,你以为它能给你锁定版本,其实不能。

Poetry

用了一阵发现这个挺好,喜欢

能管理python版本和python的包,还能用来打包(这个打包感觉比setuptools舒服不少) 配置文件是单个toml,很舒服,依赖在poetry.lock里面

一个小问题是初次加载依赖有点慢,原因见这里。这也不能怪poetry,PyPI上那么多库,还有不少野库,很多库并没有规范声明Metadata,poetry没法通过调PyPI的API判断该下哪种版本的包,就只能把所有的都拉下来然后判断该用哪个

我们打开poetry.lock文件,可以看到,一个版本所有的发行包(packages)都被拉了下来

poetry.lock

这个目前无解 >At the moment there is no way around it.

如果再次用到某个库,poetry之前缓存了发行信息,不会出现那种全下一遍的事了 >Once Poetry has cached the releases' information, the dependency resolution process will be much faster.

目前还没有太好的办法,在issue评论区看到一个扭曲的方法

poetry export -f requirements.txt > requirements.txt
python -m pip install -r requirements.txt
poetry install

Docker&虚拟机

Django之类的项目部署的时候推荐Docker 一般开发环境没有必要上Docker,真机就挺好,Docker不熟悉的反而可能造成不少麻烦(比如网络部分那堆坑),怕搞乱环境不如直接上虚拟机。 Docker的镜像有官方的python,但是非常大,上G。如果自己写Dockerfile构建一个,缩减镜像,调度每个容器的内存,都是远比前面那几个东西麻烦的事情。 Docker我感觉并不适合个人开发环境,感觉部署和运行的时候方便点,用来当开发环境体验不是太好。 Docker在调试的时候并不太舒服,而且对Docker初学者来说,网络那里很多坑,为了方便或节省时间用Docker配python的开发环境 但是这么一配置,怎么比原来麻烦多了,Docker狂热爱好者吹嘘的部署方便这里在需要调试的时候并没有什么优势。 虽然Docker本身并不吃你太多内存,但是Docker容器跑起来,如果不调度和限制,经常占了好多内存,虽然写python一般也不在乎在这个。

anaconda

我反正不喜欢,没怎么用过,看到这种全家桶我就害怕(早年360和金山留下的阴影,请谅解)。 把python当matlab用的、习惯matlab那种又大又卡但是科学计算功能齐全的全家桶的人可以装个这个。 win10有些包很难装,倒是可以把ananconda当jupyter notebook的win10安装工具人;平时就写写python玩就不要装这玩意了,打开win10的应用商店,搜python,点安装,好了,用吧 炼丹CUDA之类的建议出门左转用Linux,win10跟torch之类的东西八字不合,这是conda也挽救不了的

参考

  1. PEP8
  2. Effective Python 翻译版
  3. Fluent Python
  4. pylint
  5. poetry官网
  6. dephell打包工具