2015-05-13 6 views
5

Voglio creare un'applicazione python chiamata knife che può essere eseguita dalla CLI, il problema è che non è possibile importare i moduli. Ho seguito la stessa struttura di cartelle del progetto Django come riferimento.Lo script CLI installato da setup.py di Python non consente di importare lo stesso modulo

La mia struttura di directory è come questo:

knife/ 
    knife/ 
     bin/ 
      knife-cli.py 
     core/ 
      main/ 
       __init__.py 
      __init__.py 
     __init__.py 
    setup.py 

mio setup.py assomiglia a questo:

#!/usr/bin/env python 

from setuptools import setup, find_packages 

exclude = ['knife.bin'] 

setup(name='Knife', 
     version='0.3', 
     description='Very cool project', 
     author='John Doe', 
     author_email='[email protected]', 
     packages=find_packages(exclude=exclude), 
     include_package_data=True, 
     scripts=['knife/bin/knife-cli.py'], 
     entry_points={ 
     'console_scripts': [ 
      'knife-cli = knife.core.main:main' 
     ] 
     }, 
     zip_safe=False, 
    ) 

mio knife/core/main/__init__.py contiene una funzione main() e la mia knife/bin/knife-cli.py si presenta così:

#!/usr/bin/env python 

from knife.core import main 

if __name__ == "__main__": 
    main.main() 

Quindi dopo l'installazione ing il modulo con setup.py install, provo a fare funzionare il coltello-cli, ma continua a gettare questo errore:

$ knife-cli 
Traceback (most recent call last): 
    File "/usr/bin/knife-cli", line 9, in <module> 
    load_entry_point('Knife==0.3', 'console_scripts', 'knife-cli')() 
    File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 468, in load_entry_point 
    return get_distribution(dist).load_entry_point(group, name) 
    File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2563, in load_entry_point 
    return ep.load() 
    File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2254, in load 
    ['__name__']) 
    File "/usr/bin/knife.py", line 4, in <module> 
    File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 646, in run_script 
    self.require(requires)[0].run_script(script_name, ns) 
    File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 1559, in run_script 
    raise ResolutionError("No script named %r" % script_name) 
pkg_resources.ResolutionError: No script named 'knife.py' 

Che cosa sta realmente accadendo? e come posso risolverlo?

+0

Perché è stato definito un punto di ingresso e uno script con lo stesso nome? – davidism

+0

Ho appena copiato la stessa logica di setup.py nel progetto django, fondamentalmente perché uno ha il file .py finale (knife-cli e knife-cli.py). –

risposta

3

Sono necessari altri __init__. Il file __init__.py dice a python che la cartella è un modulo python. Stai rifrangendo questi come moduli nello script di installazione, quindi devi dire a python che si tratta di moduli.

knife/ 
    knife/ 
     bin/ 
      knife-cli.py 
     core/ 
      main/ 
       __init__.py 
      __init__.py 
     __init__.py 
    setup.py 

Questo dovrebbe risolvere il problema principale. Tuttavia, stai anche dichiarando due script, uno con la sezione scripts e l'altro con lo console_scripts. Gli script della console creeranno effettivamente lo script per te, quindi non devi includere il tuo in "bin".

Ecco un setup.py migliore per voi: (nota ho appena rimosso la sezione script)

#!/usr/bin/env python 

from setuptools import setup, find_packages 

exclude = ['knife.bin'] 

setup(name='Knife', 
     version='0.3', 
     description='Very cool project', 
     author='John Doe', 
     author_email='[email protected]', 
     packages=find_packages(exclude=exclude), 
     include_package_data=True, 
     entry_points={ 
     'console_scripts': [ 
      'knife-cli = knife.core.main:main' 
     ] 
     }, 
     zip_safe=False, 
    ) 
+0

Ho 2 script uno è coltello-cli e l'altro è knife-cli.py, non dovrebbe essere un problema, ho appena copiato la logica in setup.py di django. Ho anche il mio '__init __. Py' nel nucleo, ho appena dimenticato di includerlo. –

+1

Avete un '__init __. Py' nella directory del coltello figlio pure? –

+0

Sì, l'ho anche dimenticato. –

4

Got it, La sceneggiatura è stata eseguendo il file vecchio /usr/bin/knife.pyc, ho appena cancellato e adesso funziona bene .

+1

FML. Ho passato troppo tempo (come 4 ore) a lavorare su questo. Sarebbe bello se Python riconoscesse costantemente artefatti datati. – weberc2