Opcja 1: Zainstaluj jako dane pakietu
Główną zaletą umieszczania plików danych w katalogu głównym pakietu Pythona jest to, że pozwala uniknąć martwienia się o to, gdzie pliki będą znajdować się w systemie użytkownika, którym może być Windows, Mac, Linux, jakaś platforma mobilna lub wewnątrz Egg. Zawsze możesz znaleźć katalog data
względem katalogu głównego pakietu Pythona, bez względu na to, gdzie i jak jest zainstalowany.
Na przykład, jeśli mam taki układ projektu:
project/
foo/
__init__.py
data/
resource1/
foo.txt
Możesz dodać funkcję do, __init__.py
aby zlokalizować bezwzględną ścieżkę do pliku danych:
import os
_ROOT = os.path.abspath(os.path.dirname(__file__))
def get_data(path):
return os.path.join(_ROOT, 'data', path)
print get_data('resource1/foo.txt')
Wyjścia:
/Users/pat/project/foo/data/resource1/foo.txt
Po zainstalowaniu projektu jako Egg ścieżka do data
zmieni się, ale kod nie musi się zmieniać:
/Users/pat/virtenv/foo/lib/python2.6/site-packages/foo-0.0.0-py2.6.egg/foo/data/resource1/foo.txt
Opcja 2: Zainstaluj w stałej lokalizacji
Alternatywą byłoby umieszczenie danych poza pakietem Pythona, a następnie:
- Miej lokalizację
data
przekazaną za pośrednictwem pliku konfiguracyjnego, argumentów wiersza poleceń lub
- Osadź lokalizację w kodzie Pythona.
Jest to znacznie mniej pożądane, jeśli planujesz rozpowszechniać swój projekt. Jeśli naprawdę chcesz to zrobić, możesz zainstalować swój w data
dowolnym miejscu w systemie docelowym, określając miejsce docelowe dla każdej grupy plików, przekazując listę krotek:
from setuptools import setup
setup(
...
data_files=[
('/var/data1', ['data/foo.txt']),
('/var/data2', ['data/bar.txt'])
]
)
Zaktualizowano : Przykład funkcji powłoki rekurencyjnej do plików grep Python:
atlas% function grep_py { find . -name '*.py' -exec grep -Hn $* {} \; }
atlas% grep_py ": \["
./setup.py:9: package_data={'foo': ['data/resource1/foo.txt']}