我有一个名为"example"的库,我正在将它安装到全局站点软件包目录中。然而,我想要能够安装两个版本,一个用于生产环境,另一个用于测试(我有一个网络应用程序和其他按照这种方式进行版本控制的东西)。
是否有一种方法可以指定例如 "python setup.py stage",不仅可以将不同的egg安装到site-packages中,还可以将模块从"example"重命名为"example_stage"或类似的名称?
如果distutils无法实现此功能,是否有其他工具可以实现?
我有一个名为"example"的库,我正在将它安装到全局站点软件包目录中。然而,我想要能够安装两个版本,一个用于生产环境,另一个用于测试(我有一个网络应用程序和其他按照这种方式进行版本控制的东西)。
是否有一种方法可以指定例如 "python setup.py stage",不仅可以将不同的egg安装到site-packages中,还可以将模块从"example"重命名为"example_stage"或类似的名称?
如果distutils无法实现此功能,是否有其他工具可以实现?
通过在setup.py中子类化distutils.core.Command,可以很容易地使用distutils实现这一点。
例如:
from distutils.core import setup, Command
import os, sys
class CleanCommand(Command):
description = "custom clean command that forcefully removes dist/build directories"
user_options = []
def initialize_options(self):
self.cwd = None
def finalize_options(self):
self.cwd = os.getcwd()
def run(self):
assert os.getcwd() == self.cwd, 'Must be in package root: %s' % self.cwd
os.system('rm -rf ./build ./dist')
要启用命令,必须在setup()中引用它:
setup(
# stuff omitted for conciseness.
cmdclass={
'clean': CleanCommand
}
请注意,您也可以以此方式覆盖内置命令,就像我在'clean'上所做的那样。(我不喜欢内置版本留下'dist'和'build'目录。)
% python setup.py --help-commands | grep clean
clean custom clean command that forcefully removes dist/build dirs.
有一些约定惯例:
最好的示例是查看默认命令之一的源代码,例如 PYTHON_DIR/distutils/command 中的 install.py 或 build.py。
当然,您可以通过添加以下内容到distutil配置文件来扩展新命令:
[global]
command-packages=foo.bar
distutils
包中的distutils.cfg
,在您的主目录中的..pydistutils.cfg
(Windows上没有前导点),或当前目录中的setup.cfg
中进行设置。stage
,继承distutils.cmd - 文档比较薄弱,但由于所有现有的distutils命令也是这样构建的,因此有很多示例。