本文来自依云's Blog,转载请注明。
Python 3.8 发布有好多天了,Arch Linux 也早就重新打包了一千多个包(感谢辛勤的肥猫猫),隔天就从 [staging] 进入 [testing] 了,四天之后进入正式仓库([extra] 和 [community])。
Python 3.8 进入官方仓库的次日,我本地进行了更新。之所以要等一天,自然是等 [archlinuxcn] 的更新啦。然后那些需要人工干预而又暂时没人理的我本地重新打包了。使用 pacman -Qo /usr/lib/python3.7/site-packages 查询尚未更新的软件包,然后对着对应的 PKGBUILD 一顿改(基本上也就是 pkgrel 加 0.1 而已),makepkg -si 就好了。
但是这样还没完事哦。
先 sudo updatedb
更新一下 mlocate 的数据库。然后 locate -be python3.7 | grep -v /var/lib/lxc
找到一些残留的文件,主要是 ~/.local/lib 下的,以及散落在管理之外的 venv 里的。~/.local/lib 下的都是我自己的项目,删掉然后重新去项目里 python setup.py develop --user
就好了。venv 的话,直接删掉吧……
然后是 locate -be python-37 | grep -v /var/lib/lxc | grep -v /usr/lib/python3.7/site-packages
。这个是为了查 Python 3.7 的 pyc 文件,所以这次也排除了 Python 3.7 的 site-packages,避免尚未更新的 Python 包的干扰(有些暂时用不到的包我就懒得自己 makepkg 了),等更新完之后整个目录删掉。有些软件包(比如 gdb-common)没有使用标准的 Python 安装流程(比如因为并不是标准的 Python 库),打包者(比如著名的 Allan McRae)没有或者拒绝在打包时编译 pyc 文件,造成 Python 自行创建不被管理的 pyc 文件,软件包卸载或者 Python 升级后就残留下来了。
确认没有问题之后(比如有些软件可能自带了个旧版本的 Python,或者有些并不是 pyc 的文件也包含这个字符串),执行 locate -be python-37 | grep -v /var/lib/lxc | grep -v /usr/lib/python3.7/site-packages | sudo xargs rm -v
删除这些文件。当然如果有需要保留的文件自行从文件列表中删掉先。
pyc 清理之后,接下来清理一下空的 __pycache__ 目录啦。locate -be __pycache__ | sudo xargs rmdir -v 2>/dev/null
就可以了,非空目录不会被删掉的。
哦对了,我现在在用 mypy 了,所以还要 locate -we .mypy_cache/3.7
一下。
我之所以现在记录这事儿,「现在」的原因是,我要在另一个系统上再测试一遍再发布出来,「记录」的原因是,下一次我就不用想要执行哪些命令了。
Nov 29, 2019 06:08:27 PM
沙发哦!
Dec 12, 2019 01:47:42 PM
你是在做Linux的包发布吗?有没有考虑用容器来做打包环境?
我目前都是在容器里做RPM,感觉不用操心环境不干净的问题了。
Dec 12, 2019 03:54:46 PM
是清理我自己的系统。
我从来不用担心打包环境干不干净,因为 Arch Linux 有专门的工具。Debian 那边好像也有。只有 rpm 他们竟然连这么基础的东西都木有……
Dec 12, 2019 05:37:43 PM
上头指定了rpm,就rpm了,哈哈。
对了,pyc这个问题我一直没有注意,我觉得打进去会增加包的大小还有最后一步压缩的时间。文件残留可以在包卸载脚本了连同目录一起rm掉。在包里记录pyc很有必要吗?仙子怎么看?
另外现在mypy靠谱吗,1年多前试了下发现效果不太理想(可能那时候PEP484还不普及)?平时用vim ale,适合一起用吗?还是要装其他的插件?
Dec 12, 2019 06:22:18 PM
pyc 是编译产物。你打包进去的话,就不用安装的时候花 CPU 编译了。另外作为通用策略,千万不要忘了编译 pyc。没有 pyc 时部分库加载会很慢的,而加载时又不一定对 pyc 所应在目录有写权限。
我的意见是把 pyc 打包进去,省心又省力。导致我需要手动清理的,一是部分没有打包 pyc 的包,二是我自己散落在各处的文件。
mypy 不是很完善,但用来辅助编码和重构是相当好的。ale 我没用过。我现在也没有配置自动调用 mypy 检查。我甚至连 pre-commit hook 都没配……如果你常用的话可以配一下。
Dec 12, 2019 07:05:03 PM
aha!文件权限的问题这个细节我从来没考虑到。(开发的产品有固定用户名所以没想到这个问题)
我想到的一个问题就是预编译了pyc后如果包只含脚本,就不能作为noarch的模式了,必然是x64或者i686的一种。但听了你的描述以后感觉预编译是利大于弊!
整个团队除了我都被安利用vscode remote了,个人觉得萝卜青菜各有所爱。(ale/vim-autoformat) X (python-language-server/flake8/eslint/pretter/autopep8) 基本上可以做到web dev IDE所有能做到的事情了。最近还学会了nnoremap <silent><F1> :popu MyMenu<CR>,这样连上了年纪记不住快捷键的问题都解决了。。完美
Dec 12, 2019 07:34:16 PM
我在文档里没有看到 pyc 在不同架构上不一致的说明(也没有说是一致的),但 Arch Linux 以前同时支持 i686 和 x86_64 的时候也这么干,也没出啥问题。(当然它们是只能用于同一版本的解释器的。)
哇,popup 你都用上了!对了,Vim 现在有弹出窗口的支持了,说不定你还可以搞更强大的弹窗出来呢。
Dec 12, 2019 08:48:15 PM
我已经决定在产品的下一个版本里打包pyc文件了,也引用社区专家的建议发信让负责kubernetes的同事在docker build的时候做同样的事情,感觉在overlay fs里写缓存文件更不好。用了“she"不知道合不合适:)
今天有好多收获,感谢仙子
(平时用putty,但它不支持很多功能,连balloon都弹不出来,难受,有时间摸鱼的时候试试魔改一下)
Dec 13, 2019 12:16:46 AM
「she」没问题。
putty 不就是个终端吗。终端里的 Vim 可以自己画个小窗口显示 balloon 的,效果比 gVim 是差了不少。
Dec 13, 2019 12:25:08 AM
哦,需要知道鼠标的位置。试试 set ttymouse=sgr 或者 xterm2 呢?
Dec 20, 2019 04:05:32 PM
哎。Putty 没有实现这个功能,所以不魔改源代码应该是没戏。。,https://github.com/vim/vim/issues/3208#issuecomment-405080425
看到github上有人贴了弹窗的草案,还挺炫酷的!不过我的vim才8.1 需要重新编译一个vim,然后忽然想起了以前编译vim的复杂参数,想了半个小时想起来贴在github的某个帖子上,还在你的评论后面。。。
https://github.com/vim/vim/issues/2925#issuecomment-514109918