2017-02-28 5 views
3

Wir haben ein Python 2-Modul, das wir mit python setup.py sdist erstellen, dann auf einem Remote-Computer bereitstellen und in einem virtualenv mit pip install mymodule.tar.gz installieren.AttributError: 'Modul' Objekt hat kein Attribut '__file__'

Das Problem ist: auf einer Maschine das resultierende Modul kennt seine eigene Filepath __file__, und auf einer anderen Maschine ist es nicht. Der Testfall ist dies:

python -c "import mymodule; print(mymodule.__file__)"

Auf einer Maschine druckt es richtig den vollständigen Pfad zu einer Stelle innerhalb des virtualenv „site-packages“. Bei einer anderen sehr ähnlichen Maschine hebt es:

AttributeError: 'module' object has no attribute '__file__'

(Die betreffenden Maschinen sind AWS EC2 Knoten mit Ubuntu 14.04.)

Das Problem gesehen wurde, als einen Weg mit pkg_resources zu lösen versuchen, indem doing python -c "import pkg_resources; print(pkg_resources.resource_filename('mymodule', 'migrations'))" - dies sollte den vollständigen Pfad zum Modul-Code geben, aber nicht auf dem problematischen Rechner ordnungsgemäß gelöst werden.

Ich kann keine Unterschiede in der Shell-Umgebung, die Menge der von pip installierten Pakete oder das Dateisystem für "mymodule" sehen, nachdem es von pip installiert wurde. Ich habe cd Ed in einen leeren Ordner, um sicherzustellen, dass ich nichts von cwd importieren.

Welche Unterschiede kann ich untersuchen, um dieses Problem zu verfolgen? Wie kann ich sicherstellen, dass mein pip install ein Paket installiert, das seinen Dateipfad kennt?

Antwort

0

Die Ursache des Problems für uns war eigentlich, dass wir zwei Module installiert haben, und Python scheint eine Bestellambiguität zu haben. Wir konzipierten und installierten diese beiden Module als separater Codebases:

mymodule 
mymodule.crazything 

Mit anderen Worten, diese ein eigenständiges Paket ist ein Submodul mymodule hinzufügen. Dies bedeutet, dass wenn diese kompiliert wird, ein virtueller mymodule ohne Inhalt erstellt wird.

Bei der Installation dieser beiden Pakete sind dann zwei separate mymodule Module installiert. Welche davon wird verwendet, wenn Sie import mymodule ausführen? Soweit ich das beurteilen kann, ist dies von Python undefiniert und lokal konsistent, aber nicht konsistent zwischen Rechnern.

Die Lösung für uns war: Erstellen Sie keine separaten Pakete mit Submodulen. Stattdessen geben wir ihnen separate Modulidentitäten, die nicht kollidieren.

Verwandte Themen