2017-07-10 3 views
0

Ich habe ein Python-Paket, das auf Linux-Maschinen abzielt und seine Gebietsschemadateien an einem zugänglichen Ort installieren muss. Im Moment habe ich sie auf sys.prefix + "/share/locale/" installiert.Python Installieren von Datendateien und erneutes Auffinden von Dateien

Allerdings fand ich einen kleinen Vorbehalt mit Ubuntu und Pip. Unter Standardbedingungen installiert Ubuntu Pakete, die mit pip installiert wurden, auf /usr/local und setzt sys.prefix während der Installation auf dieses Paket. Nach der Installation wird jedoch beim Ausführen des Pakets das Präfix /usr angezeigt, was bedeutet, dass mein Code die unter /usr/local installierten Ländereinstellungen nicht finden kann.

Ich könnte einfach den Speicherort hartcodieren, aber ich würde es vorziehen, dies nicht zu tun, da es das Paket weniger portabel macht und würde erfordern, dass der Benutzer es als root installiert. Diese werden in setup.py als data_files hinzugefügt und können nicht als Python-Paket erkannt werden.

Wie kann ich sonst sicherstellen, dass mein Paket meine lokalen Dateien nach Installation finden kann?

Ich dachte über das Hinzufügen einer Zeile zum Paket __init__.py während der Installation, die eine Variable erstellt, die auf den Speicherort der locale dir zeigt. Es scheint jedoch nicht trivial zu sein, Dateien zu bearbeiten, die installiert werden, ohne die Quelldateien zu ändern.

Dies ist ein Python 3 nur Paket.

+0

Sind Sie sicher, dass Sie nicht zwei Pythons haben - in/usr/local/bin und in/usr/bin? Ich glaube nicht, dass Python 'sys.prefix' auf diese Weise ändert. Aber 2 verschiedene Pythons können 2 verschiedene Präfixe haben. – phd

+0

@phd '' finden 'echo $ PATH | tr ':' "" -name python3 '' 'zeigt nur'/usr/bin/python3' an. Ich vermute, dass dies passiert, weil Ubuntu die Dateien, die vom Benutzer mit pip installiert werden, nach/usr/local verschieben soll, so dass es das Präfix ändert, aber es dann wieder für den Hauptcomputer ändern muss, – DonyorM

Antwort

1

Vielleicht die resource functions available in pkg_resources verwenden, um die Dateien zu finden?

from pkg_resources import resource_stream, resource_filename 
with resource_stream('my_package', 'locale/foo.dat') as infp: 
    # ... 
# ... or ... 
foo_location = resource_filename('my_package', 'locale/foo.dat') 
+0

Also, wie würde mir das helfen? wenn ich den Pfad zu den Dateien nicht kenne? Dies sind Datendateien, die nicht in einem Paket enthalten sind. – DonyorM

+0

Punkt sollte sie in Ihrer Pakethierarchie sein, wenn sie Datendateien sind, die Ihr Paket erfordert. – AKX

+0

Wirklich? Gebietsschema-Dateien sollen unter/usr/share/locale (zumindest unter debian) gehen. Ich denke nicht, dass es angebracht wäre, ein Paket daraus zu machen. Ich kompiliere auch .po zu .mo-Dateien mit gettext, also ist es etwas ärgerlich, es als Paketdaten hinzuzufügen, aber ich denke, das ist möglich. – DonyorM

Verwandte Themen