是否可以根据 setuptools 自动删除由setup.py
脚本生成的构建产品?
我刚刚开始使用新的Python项目,这是我第一次使用 setuptools 作为开发人员,所以我可能会遇到问题。当我使用python setup.py bdist
构建项目时,会创建三个目录build
,dist
和一个以.egg-info
结尾的目录。然后,当我运行python setup.py clean
时,它似乎没有做任何事情而只是打印出来:
running clean
我已尝试将--all
添加到clean
命令,虽然它确实删除了build
目录中的某些文件,但它并不会删除目录本身或其他两个目录中的任何文件。
我认为这应该很容易实现,并且我只是在寻找错误的地方。我已经习惯了这个功能,例如几乎所有使用make
的项目,其中make clean
或make distclean
将删除任何构建产品。
答案 0 :(得分:3)
标准方法:
distutils.command.clean
来自Cleaning build directory in setup.py和documentation:
此命令删除由构建及其子命令创建的临时文件,如中间编译的目标文件。使用--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}
)
我解决它的另一种方法是手动删除所有内容(使用shutil和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'}
允许此类在安装后运行。 See this answer for more details
是什么让我想到使用shutil?
使用shutil的想法来自旧的documentation:
其中一些可以用shutil模块替换?