Are all post-install options for python setuptools broken?

I'm trying to package a build of PyQt (installers aren't provided for the configuration I need), but I can't find any packaging configuration that works. The issue is not specific to PyQt though.

The problem: In order for the module to work, it needs a file in python's PREFIX directory. I understand that this may be bad form, but in my case there needs to be a qt.conf file there, and there isn't anything much I can do about it other than make the file available. I need to be able to run a post-install script to create the file with the installed PyQt path included. Or at least that seems like the best solution.

Options I looked at:

  • I can use python install and override the setuptools.command.install class. However, this works when is run manually, and requires unzipping the bdist and having a cmd prompt in the package folder. It doesn't work for bdist_wininst, bdist_msi, or bdist_wheel, which are much more convenient to install (the point of packaging). So possible, but not a great solution.

  • bdist_wheel seems like a good option, but it won't run anything post-install, and only puts files in specific folders, not including PREFIX.

  • bdist_wininst supports a post-install script (via --install-script switch when creating the package), but doesn't play nice with virtualenv. There is a stackoverflow answer that suggests running easy_install or wheel convert, but those options only unpack, they won't run the install script. Otherwise you have to change the registry, which is not an acceptable solution.

What am I missing? Is there a viable option?

Asked by: Dominik903 | Posted: 06-12-2021

Answer 1

As kynan explains, to gain control one must define "class install" to override run().


To quote the code he supplied:

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, ''],
         cwd=os.path.join(dir, 'packagename'))

class install(_install):
    def run(self):
        self.execute(_post_install, (self.install_lib,),
                     msg="Running post install task")

    cmdclass={'install': install},

Answered by: Maddie184 | Posted: 07-01-2022

Similar questions

Post-install script with Python setuptools

Is it possible to specify a post-install Python script file as part of the setuptools file so that a user can run the command: python install on a local project file archive, or pip install <name> for a PyPI project and the script will be run at the completion of the standard setuptools install? I am looking to perform post-install...

python - How can I add post-install scripts to easy_install / setuptools / distutils?

I would like to be able to add a hook to my that will be run post-install (either when easy_install'ing or when doing python install). In my project, PySmell, I have some support files for Vim and Emacs. When a user installs PySmell the usual way, these files get copied in the actual egg, and the user has to fish them out and place th...

packaging - using setuptools with post-install and python dependencies

This is somewhat related to this question. Let's say I have a package that I want to deploy via rpm because I need to do some file copying on post-install and I have some non-python dependencies I want to declare. But let's also say I have some python dependencies that are easily available in Py...

linux - Run post-install script in a Python Egg (setuptools)

I have created a little Python egg (with setuptools) that I want to install in other machines of my LAN. I have even setup a server for the eggs and all (and the egg is properly downloaded and installed with easy_install -f http://myserver/eggrepository ) :-) I would like to know if there's a way of running an script (bash or Python) when installing it with easy_install (version 0.6c11 and python2.6). ...

python - Post-install errors while installing pywin32-216 on Windows XP

I'm using the pywin32-216.win32-py2.6.exe package to install pywin32 on Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32. I am seeing the following post install errors. Could someone help me understand what going wrong? Thanks in advance. Copied pythoncom26.dll to C:\WINDOWS\system32\pythoncom26.dll Copied pythoncomloader26.dll to C:\WINDOWS\sys...

Python packaging distribute post-install step

I am packaging a project that uses nltk. When you install nltk with pip, you get core functionalitiy, but not all the modules that come with it. To get those modules, you call nltk's download method. I tried the following, but it doesn't work, saying ImportError: No module named nltk. I assume this is happening because import nltk occurs before nltk is installed by the call to setup(...).

python - Post-install doesn't work

I'm trying to add a post-install step into the The installation works but the code inside run(self) is never executed. Things I've tried (with no result): Install it using both "pip install (-e) ." and "python (develop)" [and later uninstall it, reinstall it, delete .egg-info folder,...] Variations using: do_egg_install, build, bdist_egg,...

python - Pip Post-install Script Interactive Input?

I'm very new to python packaging, and trying to make a pip compatible setup and post-install script for my package for colleagues. The goal of the post-install script is to create a configuration file that will be customized to the end-user and their system, and while I guess I could just have them run a secondary setup script post installation, it seems to make more sense to me to just have the script and associ...

python - post-install scripts and pip install extras

I'm developing a package which has a few optional dependencies and 'extras'. Goal: I want the following two things to work: Execute my post-install code Allow for 'extras' installation Status: Currently I have been able to: Use python install or python develop to execute post-install ...

Automating post-install of Python dependency from Git using Poetry

I'm using Poetry for Python dependency management, along with PyCrate for ASN.1 encoding/decoding. PyCrate is a dependency pulled from GitHub, and once pulled from GitHub, is installed by running a setup file within the PyCrate directory. python setup.p...

python - pipenv Post-Install Actions

I'm using Python via Pharo/GToolkit's PythonBridge, which uses pipenv under the hood. Things are kicked off via this built-in PythonBridge script ( #!/bin/bash cd "$(dirname "$0")" export PIPENV_VENV_IN_PROJECT=1 pipenv install pipenv ru...

Still can't find your answer? Check out these communities...

PySlackers | Full Stack Python | NHS Python | Pythonist Cafe | Hacker Earth | Discord Python