python setuptools install_requires is ignored when overriding cmdclass
The same problem just happened to me. It somehow seems like something triggers setuptools to do an 'old-style install' with distutils
, which indeed does not support install_requires
.
You call install.run(self) which calls run(self) in setuptools/setuptools/command/install.py, line 51-74
def run(self): # Explicit request for old-style install? Just do it if self.old_and_unmanageable or self.single_version_externally_managed: return _install.run(self) # Attempt to detect whether we were called from setup() or by another # command. If we were called by setup(), our caller will be the # 'run_command' method in 'distutils.dist', and *its* caller will be # the 'run_commands' method. If we were called any other way, our # immediate caller *might* be 'run_command', but it won't have been # called by 'run_commands'. This is slightly kludgy, but seems to # work. # caller = sys._getframe(2) caller_module = caller.f_globals.get('__name__','') caller_name = caller.f_code.co_name if caller_module != 'distutils.dist' or caller_name!='run_commands': # We weren't called from the command line or setup(), so we # should run in backward-compatibility mode to support bdist_* # commands. _install.run(self) else: self.do_egg_install()
I'm not sure whether this behaviour is intended, but replacing
install.run(self)
with
install.do_egg_install()
should solve your problem. At least it works for me, but I would also appreciate a more detailed answer. Thanks!
According to https://stackoverflow.com/a/20196065 a more correct way to do this may be to override bdist_egg
command.
You could try:
from setuptools.command.bdist_egg import bdist_egg as _bdist_eggclass bdist_egg(_bdist_egg): def run(self): call(["pip install -r requirements.txt --no-clean"], shell=True) _bdist_egg.run(self)...setup(... cmdclass={'bdist_egg': bdist_egg}, # override bdist_egg)
It worked for me and install_require
is no more ignored. Nevertheless, I still don't understand why most people seem to override cmdclass install
and do not complain about install_require
being ignored.
I know this is an old question, but I ran into a similar problem. The solution I have found fixes this problem for me is very subtle: The install
class you're setting in cmd_class
must physically be named install
. See this answer on a related issue.
Note that I use the class name install for my derived class because that is what python setup.py --help-commands will use.
You also should use self.execute(_func_name, (), msg="msg")
in your post_install instead of calling the function directly
So implementing something like this should cause you to avoid the do_egg_install
workaround implemented above by KEgg.
from setuptools.command.install import install as _install...def _post_install(): #code hereclass install(_install): def run(self): _install.run(self) self.execute(_post_install, (), msg="message here")