代码之家  ›  专栏  ›  技术社区  ›  dave paola

自定义distutils命令

  •  24
  • dave paola  · 技术社区  · 15 年前

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

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

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

    4 回复  |  直到 15 年前
        1
  •  13
  •   Alex Martelli    15 年前

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

     [global]
     command-packages=foo.bar
    

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

    然后您需要在python的site package s目录中有一个foo.bar包。

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

        2
  •  51
  •   jathanism    15 年前

    使用distuils可以很容易地通过子类化来实现这一点。 distutils.core.command命令 在setup.py中。

    例如:

    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目录/distutils/command 安装程序 建筑工程 .

        3
  •  4
  •   jfs    15 年前

    如果您想使用多个版本,那么 virtualenv 具有 virtualenvwrapper 可以帮忙。

        4
  •  3
  •   Community CDub    8 年前

    Alex's answer 如果你想用distutils做这个,但是我发现 Paver 为了更好的处理这类事情。它使定制命令或覆盖现有命令变得更容易。另外,如果您习惯了distuils或setuptools,那么转换就不会非常困难。