2015-04-09 22 views
10

Mam projektu strukturalnego, takich jak:import kończy się niepowodzeniem podczas uruchamiania Pythona jako skrypt, ale nie w iPythonie?

folder1 
     | 
     folder2 
      | 
      tests 

mam __init__.py w każdym folderze. Kiedy znajduję się w katalogu nadrzędnym folderu1, uruchamiam iPython i wykonuję wszystkie operacje. Wszystko działa bez zarzutu. Jednak gdy uruchamiam

python folder1/folder2/tests/test1.py 

uzyskać ImportError: No module o nazwie folder1.folder2.file1, gdzie moje oświadczenie import w test1 jest

from folder1.folder2.file1 import class1 

Confused o tym - Domyślam się, że jest to kwestia ścieżka ale nie rozumiem, co jest nie tak z moim kodem (wiele podobnych ustawień w innych folderach) i dlaczego wciąż działa w iPythonie, a nie w pythonie uruchamianym jako skrypt.

Odpowiedz

8

module search path (python 3 docu) jest inna i bez pliku skryptu:

interaktywny interpreter Pythona

(idzie zarówno python i ipython)

$ python 
Python 2.7.3 (default, Dec 18 2014, 19:10:20) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> print(sys.path) 
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7/gtk-2.0', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol'] 
>>> 

Uwaga pierwszy wpis bycia pusta struna. Pusty łańcuch jest ścieżką względną równoważną .. Względne ścieżki w ścieżce wyszukiwania modułów są względne w stosunku do bieżącego roboczego procesu tłumacza, więc jest to tylko aktualny katalog roboczy, w którym wywołano interpreter. (Co w Twoim przypadku stało się źródłem projektu.)

wykonywania pliku skryptu

$ echo 'import sys' > /tmp/pathtest.py 
$ echo 'print(sys.path)' >> /tmp/pathtest.py 
$ python /tmp/pathtest.py 
['/tmp', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7/gtk-2.0', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol'] 

pamiętać, że tutaj, pierwsza pozycja to absolutna ścieżka do katalogu zawierającego plik skryptu mijaliśmy jako argument.

+3

tak po prostu dodaj 'import sys; sys.path = [''] + sys.path' do skryptu – aforaudrey

+1

również, nie ulegaj pokusie używania 'sys.path.extend ([''])' (tak jak ja), ponieważ zamówienie robi różnica. – gpano

4

Napotkałem podobny problem podczas importowania numpy lub dowolnej biblioteki w zależności od numpy. Problem polegał na tym, że w moim folderze projektu miałem nazwę pliku random.py.

Numpy ma random.py w tym miejscu dla swoich losowych funkcji, ale zaimportowanie go zabierało los.py z mojego folderu projektu.

Najlepszym rozwiązaniem jest nie nazywać żadnego pliku standardowymi nazwami modułów żadnej biblioteki.

Ciesz .. :)

+0

o mój Boże ... Dziękuję bardzo! Użyłem nazwy "redmine" i próbowałem zaimportować moduł redmine ... – QtRoS