【问题标题】:Custom distutils commands自定义 distutils 命令
【发布时间】:2010-12-15 05:08:07
【问题描述】:

我有一个名为“example”的库,我将它安装到我的全局站点包目录中。但是,我希望能够安装两个版本,一个用于生产,一个用于测试(我有一个 Web 应用程序和其他以这种方式进行版本控制的东西)。

有没有办法指定,比如“python setup.py stage”,它不仅可以将不同的 egg 安装到站点包中,还可以将模块从“example”重命名为“example_stage”或类似的名称?

如果distutils不能做到这一点,有没有其他工具可以做到?

【问题讨论】:

    标签: python deployment distutils


    【解决方案1】:

    这可以通过在 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.
    

    使用了许多约定:

    • 您可以使用 user_options 指定任何命令行参数。
    • 您声明将与 initialize_options() 方法一起使用的任何变量,该方法在初始化后调用,以便为子类设置您的自定义命名空间。
    • finalize_options() 方法在 run() 之前调用。
    • 命令本身的内容将出现在 run() 中,因此请务必在此之前进行任何其他准备工作。

    最好的例子是查看 PYTHON_DIR/distutils/command 中的默认命令之一的源代码,例如 install.py 或 build.py.

    【讨论】:

    【解决方案2】:

    当然,您可以使用新命令扩展 distutils。在您的 distutil 配置文件中,添加:

     [global]
     command-packages=foo.bar
    

    这可以在 distutils 包本身的 distutils.cfg 中,在您的主目录中的 ..pydistutils.cfg(在 Windows 上没有前导点),或在当前目录中的 setup.cfg

    那么你需要一个 foo.bar 包在你的 Python 的 site-packages 目录中。

    然后在该包中添加实现新所需命令的类,例如stage,子类化distutils.cmd - 文档很弱,但是有很多示例,因为所有现有的 distutils 命令也是构建的方式。

    【讨论】:

    • 这回答了所提出的问题,但 virtualenv 是该问题的更好答案。
    【解决方案3】:

    如果您想使用多个版本,那么 virtualenvvirtualenvwrapper 可以提供帮助。

    【讨论】:

      【解决方案4】:

      如果你想用 distutils 做这件事,请参阅 Alex's answer,但我发现 Paver 更适合这种事情。它使制作自定义命令或覆盖现有命令变得更加容易。另外,如果您习惯使用 distutils 或 setuptools,过渡也不是很困难。

      【讨论】:

      • Paver 提供了许多有趣的便捷功能和快捷方式。另一方面,它在 distutils 之上添加了另一个范式(和架构)。我更喜欢一个简单的 setup.py 文件,它是独立的,可以做所有需要做的事情。
      猜你喜欢
      • 2014-03-17
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      相关资源
      最近更新 更多