如何删除构建产品

时间:2015-02-01 16:23:53

标签: python build-process setuptools

是否可以根据 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将删除任何构建产品。

1 个答案:

答案 0 :(得分:3)

标准方法:

distutils.command.clean

来自Cleaning build directory in setup.pydocumentation

  

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

另一种方法:

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

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

  

似乎并非所有setup.py脚本都支持clean。示例:NumPy - kevinarpe 2016年6月15日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}
     )

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

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

是什么让我想到使用shutil?

使用shutil的想法来自旧的documentation

  

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