在写一个 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 了。