Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pip not picking up a custom install cmdclass

Tags:

python

pip

so I found this answer to my exact question, but for some reason it's not working:

$ cat /tmp/testinstall/setup.py:

from setuptools.command.install import install  from setuptools import setup   class verifying_install(install):     def run(self):         print "running........"         install.run(self)         print "verifying........"   setup(name='test',       version='1',       py_modules=['test'],       include_package_data=True,       zip_safe=True,       cmdclass={'install': verifying_install} ) 

But then, even though setup.py install works::

➜  /tmp/testinstall $ mktmpenv && cd - This is a temporary environment. It will be deleted when you run 'deactivate'.  (5bc7db7ca1b34ec5)➜  /tmp/testinstall $ python setup.py install running install running........ running build running build_py creating build creating build/lib.linux-x86_64-2.7 copying test.py -> build/lib.linux-x86_64-2.7 running egg_info creating test.egg-info writing test.egg-info/PKG-INFO writing top-level names to test.egg-info/top_level.txt writing dependency_links to test.egg-info/dependency_links.txt writing manifest file 'test.egg-info/SOURCES.txt' reading manifest file 'test.egg-info/SOURCES.txt' writing manifest file 'test.egg-info/SOURCES.txt' running install_lib copying build/lib.linux-x86_64-2.7/test.py -> /home/bwm/.virtualenvs/5bc7db7ca1b34ec5/lib/python2.7/site-packages byte-compiling /home/bwm/.virtualenvs/5bc7db7ca1b34ec5/lib/python2.7/site-packages/test.py to test.pyc running install_egg_info Copying test.egg-info to /home/bwm/.virtualenvs/5bc7db7ca1b34ec5/lib/python2.7/site-packages/test-1-py2.7.egg-info running install_scripts verifying........ 

(Note the running... and verifying...... lines)

pip install of the directory doesn't work:

(5bc7db7ca1b34ec5)➜  /tmp/testinstall $ deactivate && mktmpenv && cd - && pip install . Removing temporary environment: 5bc7db7ca1b34ec5 Removing 5bc7db7ca1b34ec5... New python executable in 4cac61c13d080257/bin/python Installing Setuptools...done. Installing Pip....done. This is a temporary environment. It will be deleted when you run 'deactivate'. /tmp/testinstall Unpacking /tmp/testinstall   Running setup.py egg_info for package from file:///tmp/testinstall  Cleaning up... 

And pip install of the sdist doesn't work either:

(4cac61c13d080257)➜  /tmp/testinstall $ python setup.py sdist running sdist # ..snip.. creating dist Creating tar archive removing 'test-1' (and everything under it) (4cac61c13d080257)➜  /tmp/testinstall $ deactivate && mktmpenv && cd - Removing temporary environment: 4cac61c13d080257 Removing 4cac61c13d080257... New python executable in 9a42f3a58809f1a3/bin/python Installing Setuptools...done. Installing Pip...done. This is a temporary environment. It will be deleted when you run 'deactivate'. /tmp/testinstall  (9a42f3a58809f1a3)➜  /tmp/testinstall $ ls dist test-1.tar.gz (9a42f3a58809f1a3)➜  /tmp/testinstall $ pip install dist/test-1.tar.gz Unpacking ./dist/test-1.tar.gz   Running setup.py egg_info for package from file:///tmp/testinstall/dist/test-1.tar.gz  Cleaning up... 

Note the lack of running... and verifying... words in both of those.

Anybody have any idea what's going on here?

like image 826
quodlibetor Avatar asked Oct 24 '13 15:10

quodlibetor


2 Answers

I ran into this problem just now. It looks like there are many different commands that pip install my-package can translate into.

  1. setup.py install
  2. setup.py egg_info
  3. setup.py develop

So you need to handle each of these different cases.

from setuptools.command.install import install from setuptools.command.develop import develop from setuptools.command.egg_info import egg_info  ''' BEGIN CUSTOM INSTALL COMMANDS These classes are used to hook into setup.py's install process. Depending on the context: $ pip install my-package  Can yield `setup.py install`, `setup.py egg_info`, or `setup.py develop` '''   def custom_command():     import sys     if sys.platform in ['darwin', 'linux']:         os.system('./custom_command.sh')   class CustomInstallCommand(install):     def run(self):         install.run(self)         custom_command()   class CustomDevelopCommand(develop):     def run(self):         develop.run(self)         custom_command()   class CustomEggInfoCommand(egg_info):     def run(self):         egg_info.run(self)         custom_command()  ''' END CUSTOM INSTALL COMMANDS  '''  setup(     ...     cmdclass={         'install': CustomInstallCommand,         'develop': CustomDevelopCommand,         'egg_info': CustomEggInfoCommand,     },     ... ) 
like image 164
PaulMest Avatar answered Sep 29 '22 08:09

PaulMest


I ran into the same problem. Try running pip install -vvv <path> - it may be that the messages are being hidden somehow (I don't know why - not a pip expert!). In any case, you can confirm that the code is being run by having your custom code print to a file somewhere instead of to STDOUT.

like image 25
scubbo Avatar answered Sep 29 '22 06:09

scubbo