Seite 1 von 1

Importer - wo sucht er?

Verfasst: Mittwoch 7. Dezember 2011, 16:22
von Slag
Ich habe folgendes Problem: Ich möchte eine in Python geschriebene Nicht-Standardbibliothek in mein Skript importieren, welche in einem anderen Verzeichnis als meine Python-Installation liegt.
Die verwendete Python-Version ist 2.6, Betriebssystem ist Debian Squeeze (32bit).

Folgendes habe ich bereits ausprobiert:
kompletten Dateipfad -> / ist kein zulässiges Zeichen, er erkennt es also nicht als Dateipfad (auch weglassen des ersten / hat nicht geholfen)
kompletten Dateipfad als String -> keine zulässige Syntax, markiert am zweiten Anführungszeichen, egal ob doppelte oder einzelne.
nur den Modulnamen -> Findet (wenig überraschend) den Modulnamen nicht.

Meine letzte Lösungsidee ist, die zu importierende Bibliothek in irgendein Verzeichnis zu kopieren, allerdings weiß ich nicht in welches, meine Vermutung wäre unter /usr/lib/python2.6 (python 2.4,2.5, pyshared und pymodules sind auch möglich), oder eher in das Verzeichnis in dem auch meine Skripte liegen?

Ein weiteres Problem besteht darin, dass der Rechner kein Netz hat, also Sachen die per apt-get und ähnlichem funktionieren, helfen mir leider nicht weiter.

Laut der Dokumentation könnte ich auch sys.path oder sys.meta_path manipulieren, damit er es findet, allerdings weiß ich weder wie ich diese manipuliere, noch wie ich sie manipulieren müsste um das gewünschte Ergebnis zu erzielen...

Re: Importer - wo sucht er?

Verfasst: Mittwoch 7. Dezember 2011, 16:34
von Hyperion
Slag hat geschrieben: Laut der Dokumentation könnte ich auch sys.path oder sys.meta_path manipulieren, damit er es findet, allerdings weiß ich weder wie ich diese manipuliere, noch wie ich sie manipulieren müsste um das gewünschte Ergebnis zu erzielen...
Lass Dir doch mal ``sys.path`` in einer Shell ausgeben ;-) Das ist einfach eine Liste von Pfaden. Da kannst Du einfach mittels ``.append``-Methode etwas hinzufügen.

Alternativ packst Du Dein Modul in ein dafür vorgesehens Verzeichnis. Unter Windows ist das "Lib/site-packages" im Python-Verzeichnis; unter Linux sollte sich das auch irgend wo unter /usr/shar o.ä. finden lassen. Lass einfach mal ein `find /usr -type d -name '*python*'` laufen, da findest Du sicher das gewünschte Verzeichnis.

Re: Importer - wo sucht er?

Verfasst: Mittwoch 7. Dezember 2011, 16:46
von deets
Und last but not least gibt's auch noch die Umgebungsvariable PYTHONPATH, in der Doppelpunkt-separiert Pfade stehen, welche auch durchsucht werden.

Re: Importer - wo sucht er?

Verfasst: Mittwoch 7. Dezember 2011, 16:55
von Slag
Leider weiß ich nicht, wie ich mir sys.path anzeigen lassen kann (ich habe nur die Shell auf dem Rechner), weder der Name allein, noch ls, find oder echo $sys.path haben etwas gebracht.
Ich habe das komplette Verzeichnis nunmehr in /usr/share/python kopiert, nur findet er es leider nach wie vor nicht. Hast du vielleicht noch eine andere Idee?

Re: Importer - wo sucht er?

Verfasst: Mittwoch 7. Dezember 2011, 16:59
von Hyperion
Slag hat geschrieben:Leider weiß ich nicht, wie ich mir sys.path anzeigen lassen kann (ich habe nur die Shell auf dem Rechner), weder der Name allein, noch ls, find oder echo $sys.path haben etwas gebracht.
Wie wäre es damit:

Code: Alles auswählen

>>> import sys
>>> print(sys.path)
['', 'C:\\Windows\\system32\\python32.zip', 'C:\\Program Files (x86)\\Python32\\
DLLs', 'C:\\Program Files (x86)\\Python32\\lib', 'C:\\Program Files (x86)\\Pytho
n32', 'C:\\Program Files (x86)\\Python32\\lib\\site-packages']
Slag hat geschrieben: Ich habe das komplette Verzeichnis nunmehr in /usr/share/python kopiert, nur findet er es leider nach wie vor nicht. Hast du vielleicht noch eine andere Idee?
Ich habe Dir ja einiges dazu gesagt. Probiere das obige doch mal bei Dir aus - oder den Vorschlag von deets. Dann siehst Du ja, welches Verzeichnis für 3rd-Party-Module geeignet ist. Einfach "blind" etwas in ein Verzeichnis kopieren bringt idR wenig. Wie Du bei meiner Anzeige unter Windows siehst, ist das Python-root-Verzeichnis nicht im Pfad - vermutlich ist das bei Dir auch der Fall, weswegen Deine Operation nicht zielführend war.

Re: Importer - wo sucht er?

Verfasst: Mittwoch 7. Dezember 2011, 17:05
von /me
Slag hat geschrieben:Leider weiß ich nicht, wie ich mir sys.path anzeigen lassen kann (ich habe nur die Shell auf dem Rechner), weder der Name allein, noch ls, find oder echo $sys.path haben etwas gebracht.
Du musst natürlich nicht aus der Shell des Betriebssystems heraus arbeiten, sondern aus der Python-Shell.
Slag hat geschrieben:Ich habe das komplette Verzeichnis nunmehr in /usr/share/python kopiert, nur findet er es leider nach wie vor nicht. Hast du vielleicht noch eine andere Idee?
Erweitere, wie Hyperion schon geschrieben hat, den Python-Suchpfad aus dem Programm heraus um dein gewünschtes Verzeichnis.

Code: Alles auswählen

import sys
tools_dir = '/home/matthias/pyjects/tools'
if tools_dir not in sys.path:
    sys.path.append(tools_dir)

Re: Importer - wo sucht er?

Verfasst: Mittwoch 7. Dezember 2011, 17:27
von Slag
Da hatte ich dich missverstanden, ich ging bei sys.path davon aus, dass eine Linux Systemvariable gemeint ist, danke für die Aufklärung.
Ich habe sys.path jetzt entsprechend ergänzt, mit sämtlichen Unterverzeichnissen die im kopierten Verzeichnis existierten, trotzdem findet er das Modul aber nicht (obwohl es genau in einem der angegebenen Verzeichnisse liegt, sogar als .py und als .pyc-Datei und eine __init__ ebenfalls als .py und .pyc vorhanden ist.), könnte es sich hierbei um eine Inkompatibilität zwischen verschiedenen Python-Versionen handeln und falls ja, wie bekomme ich das heraus? Oder müsste er in diesem Fall die Datei trotzdem zumindest erst Einmal finden? (mehr als die Bibliothek einzubinden macht das Skript bislang nicht)

Edit: Ich nehme meine Worte zurück, ich habe sys.path nur in einer shell verändert, dies hat aber keine globalen Auswirkungen, ergo haben die anderen shells nur in den alten Pfaden gesucht...
Ich mache es nochmal so wie /me es mir empfohlen hat.

Re: Importer - wo sucht er?

Verfasst: Mittwoch 7. Dezember 2011, 17:31
von deets
Nein, keine Inkompatibilitaet, du machst aller Wahrscheinlichkeit einfach etwas falsch.

So zB geht's:

Code: Alles auswählen

dir@client3065:/tmp/ptest$ cd /tmp
dir@client3065:/tmp$ mkdir -p foo/bar
dir@client3065:/tmp$ cd foo
dir@client3065:/tmp/foo$ export PYTHONPATH=`pwd`/bar
dir@client3065:/tmp/foo$ echo "print 'hallo, ich bin bar'" > bar/testmodule.py
dir@client3065:/tmp/foo$ python -c "import testmodule"
hallo, ich bin bar
dir@client3065:/tmp/foo$ 

Re: Importer - wo sucht er?

Verfasst: Mittwoch 7. Dezember 2011, 17:36
von Slag
Dankeschön für eure Hilfe, mit der Methode von /me hat es jetzt funktioniert :)

Re: Importer - wo sucht er?

Verfasst: Donnerstag 8. Dezember 2011, 07:19
von Dav1d
Das kann man doch auch schöner mit dem imp Modul lösen, oder?