是否可以基于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
将删除任何构建产品。
标准方法:
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 模块替换吗?