Pracujemy z repozytorium kodów, które jest wdrażane zarówno w systemie Windows, jak i Linux - czasami w różnych katalogach. W jaki sposób jeden z modułów w projekcie powinien odnosić się do jednego z zasobów innych niż Python w projekcie (pliki CSV itp.)?
Jeśli zrobimy coś takiego:
thefile=open('test.csv')
lub:
thefile=open('../somedirectory/test.csv')
Działa tylko wtedy, gdy skrypt jest uruchamiany z jednego określonego katalogu lub podzbioru katalogów.
Chciałbym zrobić coś takiego:
path=getBasePathOfProject()+'/somedirectory/test.csv'
thefile=open(path)
Czy to możliwe?
python
path
relative-path
olamundo
źródło
źródło
__file__
), '..', '..', 'resources')os.pardir
jest nieco lepszy niż'..'
, chociaż oba są równoważne zarówno w systemie POSIX, jak i Windows.Jeśli korzystasz z narzędzi instalacyjnych lub rozpowszechniasz (instalacja setup.py), wtedy „właściwym” sposobem dostępu do tych spakowanych zasobów wydaje się być użycie zasobów_pakietu.
W twoim przypadku byłby to przykład
Który oczywiście czyta zasób, a odczytane dane binarne byłyby wartością my_data
Jeśli potrzebujesz tylko nazwy pliku, której możesz użyć
Przykład:
Zaletą jest to, że gwarantuje działanie, nawet jeśli jest to dystrybucja archiwum jak jajko.
Zobacz http://packages.python.org/distribute/pkg_resources.html#resourcemanager-api
źródło
__file__
z starych dobrych czasów?W Pythonie ścieżki są względne do bieżącego katalogu roboczego , którym w większości przypadków jest katalog, z którego uruchamiany jest program. Bieżący katalog roboczy jest bardzo prawdopodobne, nie tak samo jak w katalogu pliku modułu, więc przy użyciu ścieżki względnej do bieżącego pliku modułu zawsze jest to zły wybór.
Najlepszym rozwiązaniem powinno być użycie ścieżki bezwzględnej:
źródło
Często używam czegoś podobnego do tego:
Zmienna
przechowuje nazwę pliku skryptu, w którym piszesz ten kod, dzięki czemu możesz tworzyć ścieżki w stosunku do skryptu, ale nadal zapisane ścieżkami bezwzględnymi. Działa całkiem dobrze z kilku powodów:
Ale musisz uważać na kompatybilność platformy - os.pathsep systemu Windows różni się od UNIX.
źródło
Próbujesz również znormalizować swoje
cwd
użycieos.path.abspath(os.getcwd())
. Więcej informacji tutaj .źródło
cwd
ścieżka jest modułemMożesz użyć
__file__
zmiennej wbudowanej. Zawiera ścieżkę bieżącego pliku. Zaimplementowałbym getBaseOfProject w module w katalogu głównym twojego projektu. Tam dostanę część ścieżki__file__
i ją zwrócę. Tę metodę można następnie zastosować wszędzie w projekcie.źródło
Trochę mnie tu utknęło. Chciał spakować niektóre pliki zasobów do pliku koła i uzyskać do nich dostęp. Czy pakiet używał pliku manifestu, ale instalacja przez pip nie instalowała go, chyba że był to podkatalog. Mam nadzieję, że te sceenowe strzały pomogą
MANIFEST.in
Utworzono weel przy użyciu standardowego setup.py. pip zainstalował plik koła. Po instalacji sprawdzane są zasoby. Oni są
W tfclient.py, aby uzyskać dostęp do tych plików. z
I to działa.
źródło
Długo zastanawiałem się nad odpowiedzią na to pytanie, ale w końcu zrozumiałem (i to naprawdę bardzo proste):
Spowoduje to dołączenie względnej ścieżki twojego podfolderu do katalogów, w których Python może zajrzeć. Jest dość szybki i brudny, ale działa jak urok :)
źródło
open('your/subfolder/of/choice')
.