Execute a Python script post install using distutils / setuptools

前端 未结 2 2007
攒了一身酷
攒了一身酷 2020-11-27 14:57

I\'m trying to add a post-install task to Python distutils as described in How to extend distutils with a simple post install script?. The task is supposed to execute a Pyth

相关标签:
2条回答
  • 2020-11-27 15:00

    The way to address these deficiences is:

    1. Get the full path to the Python interpreter executing setup.py from sys.executable.
    2. Classes inheriting from distutils.cmd.Command (such as distutils.command.install.install which we use here) implement the execute method, which executes a given function in a "safe way" i.e. respecting the dry-run flag.

      Note however that the --dry-run option is currently broken and does not work as intended anyway.

    I ended up with the following solution:

    import os, sys
    from distutils.core import setup
    from distutils.command.install import install as _install
    
    
    def _post_install(dir):
        from subprocess import call
        call([sys.executable, 'scriptname.py'],
             cwd=os.path.join(dir, 'packagename'))
    
    
    class install(_install):
        def run(self):
            _install.run(self)
            self.execute(_post_install, (self.install_lib,),
                         msg="Running post install task")
    
    
    setup(
        ...
        cmdclass={'install': install},
    )
    

    Note that I use the class name install for my derived class because that is what python setup.py --help-commands will use.

    0 讨论(0)
  • 2020-11-27 15:23

    I think the easiest way to perform the post-install, and keep the requirements, is to decorate the call to setup(...):

    from setup tools import setup
    
    
    def _post_install(setup):
        def _post_actions():
            do_things()
        _post_actions()
        return setup
    
    setup = _post_install(
        setup(
            name='NAME',
            install_requires=['...
        )
    )
    

    This will run setup() when declaring setup. Once done with the requirements installation, it will run the _post_install() function, which will run the inner function _post_actions().

    0 讨论(0)
提交回复
热议问题