如何删除构建产品



是否可以基于setuptools自动删除由setup.py脚本生成的构建产品?

我刚刚开始使用一个新的 Python 项目,这是我第一次作为开发人员使用 setuptools,所以我可能会出错。 当我使用 python setup.py bdist 构建项目时,将创建三个目录、builddist和一个以 .egg-info 结尾的目录。当我运行python setup.py clean时,它似乎没有做任何事情,只是打印这个:

running clean

我尝试将--all添加到 clean 命令中,虽然它确实删除了 build 目录中的一些文件,但它不会删除目录本身或其他两个目录中的任何文件。

假设这应该很容易实现,而我只是找错了地方。我已经习惯了此功能,例如,几乎任何使用make的项目都会make cleanmake distclean将删除任何构建产品。

标准方法:

distutils.command.clean

从清理 setup.py 中的构建目录和文档中:

此命令删除由 build 及其子命令创建的临时文件,如中间编译的对象文件。使用 --all 选项,将删除完整的构建目录。


另一种方法:

这可能不是最佳解决方案:

从这个答案下面的评论来看,python setup.py clean --all有时无法删除所有内容(评论示例中的 Numpy)。

似乎并非所有 setup.py 脚本都支持干净。示例:NumPy – kevinarpe Jun 15 '16 at 7:14


您可以在安装脚本中使用 remove_tree() 命令:

import glob
remove_tree(['dist', glob.glob('*.egg-info')[0],glob.glob('build/bdist.*')[0]]) 

或者在安装脚本中:

from setuptools import setup
from setuptools.command import install 
class PostInstallCommand(install):
    def run(self):
        import glob
        from distutils.dir_util import remove_tree
        remove_tree(['dist', glob.glob('*.egg-info')[0],glob.glob('build/bdist.*')[0]]) 

setup(name='Some Name',
      version='1.0',
      description='A cross platform library',
      author='Simon',
      platforms = ["windows", "mac", "linux"],
      py_modules = ['UsefulStuff', '__init__'],
      cmdclass = {'install':PostInstallCommand}
     )

我解决它的另一种方法是手动删除所有内容(使用 shutil 和 glob):

import shutil, glob
shutil.rmtree('dist')
shutil.rmtree(glob.glob('*.egg-info')[0])
shutil.rmtree(glob.glob('build/bdist.*')[0])

将其添加到安装脚本中比较困难,但是使用此答案,它应该看起来像这样:

from setuptools import setup
from setuptools.command import install 
class PostInstallCommand(install):
    def run(self):
        import shutil, glob
        shutil.rmtree('dist')
        shutil.rmtree(glob.glob('*.egg-info')[0])
        shutil.rmtree(glob.glob('build/bdist.*')[0])
        install.run(self)

setup(name='Some Name',
      version='1.0',
      description='A cross platform library',
      author='Simon',
      platforms = ["windows", "mac", "linux"],
      py_modules = ['UsefulStuff', '__init__'],
      cmdclass = {'install':PostInstallCommand}
     )

cmdclass = {'install'}允许此类在安装后运行。 有关更多详细信息,请参阅此答案。

是什么让我想到了使用 shutil?

使用 shutil 的想法来自旧文档:

其中一些可以用 shutil 模块替换吗?

最新更新