2016-05-05 31 views
8

Ho un ambiente utente in cui la maggior parte dei pacchetti python sono installati su una condivisione di rete e sono resi disponibili tramite la variabile di ambiente PYTHONPATH. Python stesso è ancora installato localmente. Alcuni di questi pacchetti devono registrare setuptools Entry Points. Normalmente, ciò accadrebbe eseguendo il file setup.py per il pacchetto, ma poiché questi sono installati in un percorso di rete, tale setup.py non viene mai eseguito con l'installazione locale di python.Come registrare i punti di ingresso per le installazioni di pacchetti Python di rete?

C'è un modo per registrare punti di ingresso senza installare un pacchetto nell'installazione python locale?

Un esempio di entrypoint che registra un callback per un sistema di plugin

setup(
    ... 
    entry_points={ 
     'xx_plugin': ['value = package.module:func'], 
    } 
) 
+0

Che tipo di punto di ingresso? È per la registrazione di plugin, 'console_scripts',' gui_scripts' o qualcos'altro? Sarebbe utile uno snippet di codice proof of concept per l'utilizzo del punto di ingresso. –

+0

@LexScarisbrick Tutto quanto sopra. Ho aggiunto un esempio di un punto di ingresso che installa un callback per un plug-in. C'è un modo per dire setuptools per installare i punti di accesso senza installare il pacchetto python. –

risposta

2

Run setup.py

I console_scripts e gui_scripts punti di ingresso creare script standalone che avvolgono un oggetto richiamabile. Il pacchetto coverage è un buon esempio di questo. Ha un punto di ingresso per creare uno script wrapper per comodità. Esempio setup.py frammento di creare uno script console:

setup(
    ... 
    entry_points = { 
     'console_scripts': [ 
      'script_name = package.module:function' 
     ] 
    } 
) 

E 'possibile installare solo gli script in una directory specificata tramite setup.py. Uno script esistente non verrà sovrascritto a meno che non venga passato l'argomento --force.

python setup.py install_scripts --install-dir /some/alternate/location 

Per un plugin, il punto di ingresso viene memorizzato come metadati in un uovo che è tipicamente installato con il pacchetto. Esempio plug punto di ingresso:

setup(
    ... 
    entry_points = { 
     'group_name': [ 
      'plugin_name = package.module:function' 
     ] 
    } 
) 

E 'possibile installare solo i metadati di un pacchetto (inclusi eventuali punti di ingresso) in una directory specificata tramite setup.py.

python setup.py egg_info --egg-base $PYTHONPATH 

rotolare il proprio

Se setup.py non può essere eseguito a scrivere i metadati uovo, è totalmente possibile rotolare il proprio, dato che è solo un file di testo in una directory. metadati esempio in base al punto di ingresso di cui sopra:

# $PYTHONPATH/entry_points.egg-info/entry_points.txt 
[group_name] 
plugin_name = package.module:function 

per testare ricerca punto di ingresso:

import pkg_resources as pkg 

for entry_point in pkg.iter_entry_points('group_name'): 
    plugin_name = entry_point.name 
    plugin_module_name = entry_point.module_name 
    plugin_callable = entry_point.load() 
    # do something with plugin