如何删除构建产品

How to remove build products

是否可以自动删除由基于 setuptoolssetup.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

来自Cleaning build directory in setup.py and the documentation

This command removes the temporary files created by build and its subcommands, like intermediary compiled object files. With the --all option, the complete build directory will be removed.


另一种方法:

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

从评论 below this answer 看来,python setup.py clean --all 有时无法删除所有内容(评论示例中的 Numpy)。

It seems not all setup.py scripts support clean. Example: 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 and glob):

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

将它添加到设置脚本中比较困难,但使用 this answer,它应该看起来像这样:

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'} 允许安装后 class 到 运行。 See this answer for more details.

是什么让我产生了使用 shutil 的想法?

使用 shutil 的想法来自旧 documentation:

Some of this could be replaced with the shutil module?