2016-09-29 2 views
0

Ich habe zwei angeblich identische Systeme. Auf beiden Systemen laufe ich die gleiche Software, aber auf einer der beiden funktioniert es nicht richtig.imp.load_sources lädt falsch Modul

Ich versuche, Funktion in einer Benutzer-bereitgestellten .py Datei auszuführen. Ich habe dies auf den folgenden grundlegenden Code reduziert, der den Fehler reproduziert:

import imp 
with open("test_scripts/load_offsets.py") as fp: 
    module = imp.load_source("load_offsets", "test_scripts", fp) 

dir(module) 

Auf dem ersten System wird die Ausgabe korrekt ist:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'os', 'test_load_offsets'] 

ich eine Funktion siehe test_load_offsets genannt, wie erwartet.

Auf dem zweiten System, erhalte ich die folgende Ausgabe:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'test_reset_position'] 

Bitte beachte, dass ich jetzt eine andere Funktion zu sehen: test_reset_position. Bei beiden Systemen ist die Datei test_scripts/load_offsets.py jedoch identisch! Noch wichtiger ist, dass es in dieser Datei keine Funktion test_reset_position gibt. Es gibt jedoch eine Funktion test_reset_position in einer anderen Datei, nämlich test_scripts/reset_position.py. Außerdem gibt es in dem Verzeichnis, in dem ich das Codebeispiel ausgeführt habe, eine Datei test_scriptsc (dies ist auf beiden Systemen der Fall). Es enthält, glaube ich, Byte-Code, aber auf dem System, wo ich das Problem sehe, kann ich Teile der Datei test_scripts/test_reset_position.py darin erkennen. Wenn ich test_scriptsc entferne, funktioniert es wieder gut, bis eine andere Datei geladen wird und dann das Problem erneut beginnt.

Also meine Schlussfolgerung ist, dass auf dem System mit dem Problem, die Datei test_scriptsc nicht korrekt aktualisiert wird. Ich verstehe jedoch weder warum, noch verstehe ich, warum das Problem nur auf einem der beiden Systeme liegt. Der einzige Unterschied, den ich zwischen den beiden Systemen finden kann, ist, dass das problematische System Python Python 2.7.12 unter Ubuntu Linux 16.04.1 ausführt, während das System ohne das Problem Python 2.7.11+ unter Ubuntu 16.04 ausführt.

Kann mir jemand helfen, herauszufinden, was hier vor sich geht? Ich habe keine Ahnung, wonach ich suchen soll ...

+0

Was bekommen Sie, wenn Sie den Wert von 'Modul .__ Datei__' auf den beiden Systemen betrachten? – BrenBarn

+0

Für beide Systeme 'Modul .__ Datei__' ist' test_scriptsc'. – Ludo

Antwort

0

Der Grund, warum es scheitert, ist, weil ich es falsch mache. Das zweite Argument zu load_source sollte der vollständige Pfad zu der Quelldatei nicht nur zu dem Verzeichnis sein, das es Python 2.7.12 documentation enthält. Ich bin mir nicht sicher, warum ich mit meiner Implementierung kam, und ich weiß nicht, warum Python 2.7.11 war es sowieso zu akzeptieren, aber die Lösung ist es, den richtigen Weg zu tun:

with open("test_scripts/load_offsets.py") as fp: 
    m = imp.load_module("load_offsets", fp, "test_scripts/load_offsets.py", ("py","r",imp.PY_SOURCE)) 

dir(m) 

Dies korrekt gibt:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'os', 'test_load_offsets'] 

ich denke, die Datei test_scriptsc ein Versuch von Byte war eine .py Datei zu kompilieren, aber da ich nicht den vollständigen Pfad geben hatte, landete ich mit etwas, das eine Art-of-kompilierten Verzeichnis war. Anscheinend hat Python 2.7.11 dies anders gehandhabt als Python 2.7.12.