2013-04-06 13 views
12

Voglio rendere il mio pacchetto python" pip installabile ". Il problema è che il pacchetto ha uno script di shell che deve essere originato nello script della shell init dell'utente (ad esempio .bashrc).Esegui attività personalizzata quando si chiama `pip install`

Ma dopo l'installazione, l'utente non sa esattamente dove è andato lo script (presumibilmente /usr/bin, ma non possiamo garantirlo). Ovviamente l'utente può eseguire which myscript.sh e modificare manualmente il suo script di init.

Ma voglio automatizzare questo passaggio. Posso creare un nuovo comando distutils, ma lo pip install non lo chiama. E posso estendere distutils.command.install.install, ma le pause di installazione tramite pip (anche se le opere tramite python setup.py install):

setup.py

from distutils.command.install import install 

class CustomInstall(install): 
def run(self): 
    install.run(self) 
    # custom stuff here 
    do_my_stuff() 

setup(..., cmdclass={'install': CustomInstall}) 

guscio

$ pip install dist/mypackage.tar.gz 
Unpacking ./dist/mypackage.tar.gz 
    Running setup.py egg_info for package from file:///path/to/mypackage/dist/mypackage.tar.gz 

Installing collected packages: mypackage 
    Running setup.py install for mypackage 
    usage: -c [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...] 
     or: -c --help [cmd1 cmd2 ...] 
     or: -c --help-commands 
     or: -c cmd --help 

    error: option --single-version-externally-managed not recognized 
    Complete output from command /path/to/.virtualenvs/myvirtualenv/bin/python -c "import setuptools;__file__='/tmp/pip-OFjrqU-build/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-s4Yo4d-record/install-record.txt --single-version-externally-managed --install-headers /path/to/.virtualenvs/myvirtualenv/include/site/python2.7: 
    usage: -c [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...] 
     or: -c --help [cmd1 cmd2 ...] 
     or: -c --help-commands 
     or: -c cmd --help 

error: option --single-version-externally-managed not recognized 

---------------------------------------- 
Command /path/to/.virtualenvs/myvirtualenv/bin/python -c "import setuptools;__file__='/tmp/pip-OFjrqU-build/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-s4Yo4d-record/install-record.txt --single-version-externally-managed --install-headers /path/to/.virtualenvs/myvirtualenv/include/site/python2.7 failed with error code 1 in /tmp/pip-OFjrqU-build 
Storing complete log in /path/to/myhome/.pip/pip.log 

Qual è il miglior aproach eseguire un'attività personalizzata dopo l'installazione di un pacchetto tramite pip?

+1

Puoi provare con 'from setuptools.command.install import install' invece di usare' distutils'? –

+1

@Alok, ha funzionato! per favore rispondi così posso accettarlo. :) – borges

+0

Fatto. Sono contento che ha funzionato. –

risposta

11

Puoi provare con from setuptools.command.install import install invece di utilizzare distutils?

+0

Grazie, questo mi ha davvero aiutato. Ho seguito (https://stackoverflow.com/questions/17806485/execute-a-python-script-post-install-using-distutils-setuptools) e ho ricevuto lo stesso problema, documentandolo in (http: // blog. diffbrent.com/correctly-adding-nltk-to-your-python-package-using-setup-py-post-install-commands/) e ti ha dato oggetti di scena –

+5

Ho lo stesso problema di [qui] (http: //stackoverflow.com/questions/19569557/pip-not-picking-up-a-custom-install-cmdclass?lq=1) - Ottengo il comportamento personalizzato quando eseguo 'python setup.py install', ma non quando I eseguire 'pip install '. qualche idea? – scubbo

+5

Ho lo stesso problema. '' 'pip install -e .''' esegue la classe di comando e quindi viene eseguita quando eseguo bdist_wheel ma durante l'installazione di pip non accade nulla. – bjorns

Problemi correlati