2015-05-13 9 views
5

Chcę utworzyć aplikację Pythona o nazwie nóż, która może być wykonana z interfejsu CLI, problemem jest to, że nie można zaimportować modułów. Zastosowałem tę samą strukturę folderów, co projekt Django.Zainstalowany przez skrypt Python skrypt CLI nie pozwala na import tego samego modułu.

Moja struktura katalogów jest tak:

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

My setup.py wygląda następująco:

#!/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, 
    ) 

My knife/core/main/__init__.py zawiera main() funkcję i mój knife/bin/knife-cli.py wygląda następująco:

#!/usr/bin/env python 

from knife.core import main 

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

Po zainstalowaniu w module setup.py install, próbuję uruchomić nóż-cli, ale nadal wyrzucam ten błąd:

$ 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' 

Co tak naprawdę się dzieje? i jak mogę to rozwiązać?

+0

Dlaczego zdefiniowałeś punkt wejścia i skrypt o tej samej nazwie? – davidism

+0

Po prostu skopiowałem tę samą logikę, co setup.py w projekcie django, jest to po prostu dlatego, że ma on końcowe .py (knife-cli i knife-cli.py). –

Odpowiedz

3

Potrzebujesz więcej __init__. Plik __init__.py informuje Pythona, że ​​folder jest modułem Pythona. Aktualizujesz je jako moduły w swoim skrypcie instalacyjnym, więc musisz powiedzieć Pythonie, że są modułami.

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

To powinno naprawić główny problem. Jednak deklarujesz także dwa skrypty: jeden używający sekcji scripts, a drugi używający console_scripts. Skrypty konsoli faktycznie utworzą skrypt dla ciebie, więc nie musisz uwzględniać własnego w "bin".

Oto lepsze setup.py dla Ciebie: (uwaga Właśnie usunięto sekcję scripts)

#!/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

Mam 2 skrypty jeden to nóż-cli, a drugi to knife-cli.py, to nie powinno być problemu, właśnie skopiowałem logikę w setup.py django. Mam też moje '__init __. Py' w rdzeniu, po prostu zapomniałem go dołączyć. –

+1

Czy masz także '__init __. Py' w katalogu noży dziecięcych? –

+0

Tak, też o tym zapomniałem. –

4

Rozumiem, skrypt wykonywał stary /usr/bin/knife.pyc plik, po prostu usunął go i teraz działa dobrze .

+1

FML. Spędziłem zbyt dużo czasu (np. 4 godziny) nad tym. Byłoby pęcznieje, gdyby Python konsekwentnie rozpoznał nieaktualne artefakty. – weberc2

Powiązane problemy