Um das ganze detailliert auszuführen:
Es gibt für jede Installation ein sog. Prefix. Bei einer Nutzerinstallation ist das in der Regel das Homeverzeichnis, bei einem Distributionspaket /usr und bei 3rd Party Programmen entweder /opt/foo oder /usr/local.
Unterhalb dieses Prefixes gibt es dann verschiedene Verzeichnisse für bestimmte Dateien:
- /bin für ausführbare Dateien
- /sbin für ausführbare Dateien, die dem Admin vorbehalten sind (bei normalen Programmen eher nicht der Fall
- /share für architektur-unabhängige Dateien:
- /share/foo für irgendwelche Datendateien (wie z.B. xml GUIs)
- /share/locale für die Gettext Hierarchie
- /lib für architektur-abhängige Dateien.
- /lib/python2.5/site-packages für globale Python-Module
- /lib/foo für Anwendungsspezifische Python-Module sowie andere architekturabhängige Dateien
Diese Richtlinien gibt der FHS vor. Allerdings ist dieser im Bezug auf Python meistens nicht korrekt umgesetzt. Streng genommen müssten Python-Module unter /usr liegen, da sie architektur-unabhängig sind. Allerdings installieren sämtliche Distributionen sowie die Distutils Python-Module unterhalb der /lib Hierarchie.
Allerdings würde ich nicht unbedingt empfehlen, diese Hierarchie für Python-Programme strikt einzuhalten. Bei binär compilierten Programmen wird das Prefix normalerweise einkompiliert, so dass das Auffinden der entsprechenden Dateien kein Problem ist. Bei Python jedoch gibt es kein Kompilieren, das Prefix muss also entweder zur Laufzeit bestimmt werden, oder mindestens eine Datei muss während der Installation angepasst werden. Ersteres ist relativ schwer, letzteres sehr hässlich.
Deswegen würde ich empfehlen, die package_data Option der Distutils zu nutzen und die Anwendung sauber in ein Paket zu verpacken. Dann kann man nämlich alle relevanten Daten sauber zur Laufzeit über das __file__ Attribut ansprechen. So mache ich das in meinen Projekten, und so wird das auch von anderen Anwendungen und Bibliotheken wie z.B. Django gemacht. Zudem erspart diese Vorgehensweise krude Installationshacks, da sie komplett per Distutils umsetzbar ist. Das erleichtert auch Distributoren das Verpacken deiner Anwendung, da für Distutils meistens Standardtools für die Paketierung existieren (bei Debian gibt es dh_python, außerdem unterstützt cdbs die distutils, für gentoo gitb es die distutils eclass, wodurch sich das Paketscript auf geschätzte 10 Zeilen reduziert).