Setup.py 的一处疑难排查
Moevis
在写一个 python 的安装脚本 setup.py 时,发现无法用 pip 卸载,报错如下:
Cannot uninstall 'xxxx'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
然而这个模块是非常简单的一个 python 文件,所以不应该会有卸载不了的问题,我回顾了一下我之前写的 setup.py 文件,主要部分如下:
from distutils.core import setup
setup(
name='xxxx',
version='0.1dev',
packages=['xxxx',],
)
在多次排查后发现我参考的教程写法不对:https://docs.python.org/3.6/distutils/setupscript.html
setup 函数实际上应该从另一个地方导入,代码如下:
from setuptools import setup
stackoverflow 上也有相关的问题,对此作了解释: https://stackoverflow.com/questions/25337706/setuptools-vs-distutils-why-is-distutils-still-a-thing
核心观点是 distutils 是内置的库,而 setuptools 是对 distutils 的一个改进,并不是所有地方都有。所以推荐是这么写:
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
说了这么多,我还是不知道为什么 distuils 到底错在了哪里,不过反正平时都用 C++,typescript 和 go 了,就不折腾太多 python 了。