2012-04-16 16 views
23

Powiedzmy, że masz moduł, który zawierautworzyć ścieżkę pliku "zawsze względem bieżącego modułu"?

myfile = open('test.txt', 'r') 

I „test.txt” plik jest w tym samym folderze. Jeśli uruchomisz moduł, plik zostanie pomyślnie otwarty. Teraz możemy powiedzieć, że importujesz ten moduł z innego, który znajduje się w innym folderze. Plik nie będzie przeszukiwany w tym samym folderze co moduł, w którym znajduje się ten kod. Jak zatem najpierw uczynić pliki wyszukiwania modułu ścieżkami względnymi w tym samym folderze? Istnieją różne rozwiązania, używając "__file__" lub "os.getcwd()", ale mam nadzieję, że istnieje bardziej przejrzysty sposób, taki sam specjalny znak w ciągu, który przekazujesz do open() lub file().

+0

czym problem z 'os.getcwd()'? – cfedermann

+1

'os.getcwd()' zwraca ścieżkę pierwszego modułu, który zaimportował ten moduł lub zaimportował inny, który go zaimportował. Pierwszy moduł może znajdować się w wielu katalogach w górę lub w dół. Tak więc nie wydaje się zbyt elegancko wpisywać 'os.getcwd() + 'coś/coś/jeszcze/else/finallyhere'' –

+1

Cóż, następnie wypróbuj proponowaną odpowiedź' sys.modules' poniżej :) – cfedermann

Odpowiedz

31

Rozwiązaniem jest użycie __file__ i to całkiem czysty:

import os 

TEST_FILENAME = os.path.join(os.path.dirname(__file__), 'test.txt') 
+0

+1, rzeczywiście! Możesz nawet po prostu "zaimportować os.path". – Emmanuel

+0

'import os.path' nie ma sensu, kiedy robisz' import os', moduł importuje 'os.path' dla ciebie (' os' jest specjalny w ten sposób). Można użyć 'od ścieżki importu os', ale nie jest to częste w przypadku modułu' os'. Jest bardzo prawdopodobne, że ma już moduł 'import os' w swoim module lub będzie go wkrótce potrzebować. Dlatego "import os" jest prawie zawsze najlepszym wyborem. – yak

+0

Sądzę, że to jest tak czyste, jak tylko możesz. Cokolwiek więcej będzie prosić o zmianę sposobu działania oficjalnego interpretera Pythona. –

Powiązane problemy