`Gurke`: noch ein weiterer `ImportError: No module named my_module`
Habe ich eine Klasse MyClass
definiert in my_module
. MyClass
hat eine Methode pickle_myself
die Gurken die Instanz der Klasse in Frage:
def pickle_myself(self, pkl_file_path):
with open(pkl_file_path, 'w+') as f:
pkl.dump(self, f, protocol=2)
Habe ich sicher gestellt, dass my_module
ist in PYTHONPATH
. In der interpreter ausgeführt __import__('my_module')
gut funktioniert:
>>> __import__('my_module')
<module 'my_module' from 'A:\my_stuff\my_module.pyc'>
Jedoch, wenn Sie schließlich das laden der Datei, den ich bekommen:
File "A:\Anaconda\lib\pickle.py", line 1128, in find_class
__import__(module)
ImportError: No module named my_module
Einige Dinge, die ich gemacht habe, sicher:
-
Habe ich nicht geändert, die Lage des
my_module.py
(Python Beizen nach dem ändern einer Modul-Verzeichnis) -
Ich habe versucht, zu verwenden
dill
statt, aber immer noch die gleichen Fehler (Mehr über python ImportError No module named)
BEARBEITEN -- EIN Spielzeug-Beispiel, das den Fehler reproduziert:
Beispiel selbst verteilt sich auf eine Reihe von Dateien.
Zunächst haben wir das Modul ball
(gespeichert in einer Datei namens ball.py
):
class Ball():
def __init__(self, ball_radius):
self.ball_radius = ball_radius
def say_hello(self):
print "Hi, I'm a ball with radius {}!".format(self.ball_radius)
Dann haben wir das Modul test_environment
:
import os
import ball
#import dill as pkl
import pickle as pkl
class Environment():
def __init__(self, store_dir, num_balls, default_ball_radius):
self.store_dir = store_dir
self.balls_in_environment = [ball.Ball(default_ball_radius) for x in range(num_balls)]
def persist(self):
pkl_file_path = os.path.join(self.store_dir, "test_stored_env.pkl")
with open(pkl_file_path, 'w+') as f:
pkl.dump(self, f, protocol=2)
Dann haben wir ein Modul, das mit Funktionen zu machen, Umgebungen, bestehen Sie, und laden Sie Sie genannt make_persist_load
:
import os
import test_environment
#import pickle as pkl
import dill as pkl
def make_env_and_persist():
cwd = os.getcwd()
my_env = test_environment.Environment(cwd, 5, 5)
my_env.persist()
def load_env(store_path):
stored_env = None
with open(store_path, 'rb') as pkl_f:
stored_env = pkl.load(pkl_f)
return stored_env
Dann haben wir ein Skript, um es alle zusammen, in test_serialization.py
:
import os
import make_persist_load
MAKE_AND_PERSIST = True
LOAD = (not MAKE_AND_PERSIST)
cwd = os.getcwd()
store_path = os.path.join(cwd, "test_stored_env.pkl")
if MAKE_AND_PERSIST == True:
make_persist_load.make_env_and_persist()
if LOAD == True:
loaded_env = make_persist_load.load_env(store_path)
Um machen es einfach, dieses Spielzeug Beispiel, Ich habe alles bis auf in einem Github-repository, das muss einfach geklont werden, die in Ihrem Verzeichnis der Wahl.. Finden Sie die README
enthält Anweisungen, die ich auch reproduzieren, hier:
Anweisungen:
1) Clone-repository in ein Verzeichnis.
2) - Add-repository-Verzeichnis zu PYTHONPATH.
3) Öffnen bis test_serialization.py
, und setzen Sie die variable MAKE_AND_PERSIST
zu True
. Führen Sie das Skript in einen Dolmetscher.
4) Schließen Sie die früheren interpreter-Instanz, und starten Sie einen neuen. In test_serialization.py
ändern MAKE_AND_PERSIST
zu False
, und dies wird programmgesteuert gesetzt LOAD
zu True
. Führen Sie das Skript in einem Dolmetscher, wodurch ImportError: No module named test_environment
.
5) standardmäßig wird der test eingestellt ist, dill, statt Gurke. Um dies zu ändern, gehen Sie in test_environment.py
und make_persist_load.py
zu ändern Einfuhren erforderlich.
EDIT: nach der Umstellung auf dill '0.2.5.dev0', dill.detect.trace(True)
Ausgabe
C2: test_environment.Environment
# C2
D2: <dict object at 0x000000000A9BDAE8>
C2: ball.Ball
# C2
D2: <dict object at 0x000000000AA25048>
# D2
D2: <dict object at 0x000000000AA25268>
# D2
D2: <dict object at 0x000000000A9BD598>
# D2
D2: <dict object at 0x000000000A9BD9D8>
# D2
D2: <dict object at 0x000000000A9B0BF8>
# D2
# D2
EDIT: dem Spielzeug-Beispiel funktioniert sehr gut, beim laufen auf Mac/Ubuntu (d.h. Unix-ähnlichen Systemen?). Es schlägt nur auf Windows.
- Ich vermute, dass
__import__('my_module')
Werke aus Ihrem aktuellen Verzeichnis. Können Sie test mit absoluten Pfad, um zu sehen, wenn Sie laufen in das gleiche problem? - Wie sind Sie "schließlich laden Sie die Datei"?
- Ich geklont, folgte den Schritten, und es funktionierte für mich. Ich weiß nicht, was das Skript Ausführen, das in einem interpreter bedeutet, so habe ich nur
python testing_serialization.py
. - Ich folgte auch die Schritte 2-5, mit der Dateien wie oben gepostet. Es funktioniert für mich (ich habe
import dill as pkl
in beiden Dateien). Also... welche version vondill
haben Sie? (Ich bin mit den master von github)... welche version von python hast du? (Ich bin mit 2.7)... was für OS hast du? (Ich bin auf MacOSX)... Sie läuft aus '.'? (Ich immer bin)... Sind Sie zu löschen alles, was dazwischen läuft (.pyc
,.pkl
, ...)? Ändern Sie Verzeichnisse zwischen dendump
laufen und dieload
? - (1)
dill version: dill.info.this_version: 0.2.4
(2) Python-version:Python 2.7.10
, 3) OS: Windows 10 Pro (3) ich bin nicht sicher, was läuft aus '.' bedeutet -- meinst du aus, dasstest_serialization.py
im gleichen Verzeichnis wie die Moduleball
,test_environment
usw.? In diesem Fall, ja, ich bin läuft aus '.' (4) war ich nicht löschen alles, was dazwischen läuft, aber ich habe eben gerade versucht es, und es machte keinen Unterschied, (5) ich bin kein Verzeichnis wechseln, wotest_serialization.py
gespeichert in zwischen läuft (nicht sicher, ob die Interpretation Frage richtig) - Ich verwendet
pip
zu installierendill
, da bin ich nicht sicher, ob ich weiß, wie es zu installieren wenn ich es von master auf github... - Ok, es ist wahrscheinlich eines von zwei Dingen: (1) es wurden ein paar
classmethod
Verbesserungen an den Stammdill
seit der Veröffentlichung von0.2.4
und Installation vongithub
geben wird, erhalten Sie alle updates. Aber ich erwarte, dass es (2) Sie sind auf der windows-ich weiß nicht regelmäßig testen auf windows, und ich habe nicht versucht, Ihren code auf windows. Ein update auf die trunk - /master-version auf github, dies zu tun:pip install --user git+https://github.com/uqfoundation/dill
oderpip install git+https://github.com/uqfoundation/dill.git@master
. Wenn das nicht funktioniert, ich die Schuld von windows. - Und, falls es weiterhin fehlschlägt, versuchen Sie die Einstellung
dill.detect.trace(True)
, und poste den traceback. Sie können auch versuchen tweaking die Serialisierung Einstellungen, mitdill.settings
zum Beispiel:dill.settings['byref'] = True
. - Ich habe jetzt
dill 0.2.5.dev0
, aber das Problem besteht immer noch. Ich aktualisierte die Frage mit der Ausgabe, wenn ichdill.detect.trace(True)
.dill.settings['byref'] = True
hat auch nicht geholfen. Ich bin das nächste mal versuchen es auf meinem Ubuntu-system. - Wo ist der Fehler von
dill.detect.trace(True)
? Wenn das der vollständige trace, es sieht aus wie es ' s kein Fehler. - Es ist nur die Ausgabe der Ablaufverfolgung, wenn dumping (die scheint in Ordnung, ich Stimme zu). Beim laden, ich habe bis
dill.detect.trace(True)
ist, aber es nicht drucken nichts raus? Ich kann fügen Sie die compiler-trace, als dass alles, was ich sehe, in mein Dolmetscher. (Ich habe aktualisiert der Github-repo, damit kannst du sehen wo ich platziert diedill.detect.trace(True)
setzt. - Musste zurücksetzen, um meine Ubuntu-installation, denn ich hatte nicht verwendet es in eine Weile. Jetzt ist es in Ordnung, und ich habe versucht, aus dem Skript. Funktioniert einwandfrei in Ordnung. Ich nehme an, Sie sollten die Schuld von Windows? Ich fügte hinzu, die
windows
tag, um die Frage zu. - Da es ein natürlicher workflow-Lösung für ein Problem, würden Sie bitte Einreichen, es als ein Problem, auf das
dill
github-Seite? Sie kann nach den gesamten traceback (hier oder hier). Ihren Erfolg unter Ubuntu zumindest sagt mir, dass ich brauche, um zu sehen, die traceback-und/oder kick die Reifen auf dieses Ding auf windows. (Stöhnen) - siehe: github.com/uqfoundation/dill/issues/140
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann ich sagen, aus Ihrer Frage, dass Sie wahrscheinlich etwas wie das zu tun, mit einer Methode der Klasse, die versucht, Gurke die Instanz der Klasse. Es ist schlecht beraten, das zu tun, wenn Sie tun, dass... es ist viel mehr vernünftig verwenden
pkl.dump
außerhalb der Klasse statt (wopkl
istpickle
oderdill
etc). Jedoch, es kann noch die Arbeit mit diesem design finden Sie unter:Dann Neustart...
Wenn Sie haben eine viel mehr komplizierte Klasse, die ich bin sicher, Sie tun, dann sind Sie wahrscheinlich in Schwierigkeiten geraten, vor allem, wenn diese Klasse verwendet eine andere Datei, die sitzt in der gleichen directory.
Dann Neustart...
Gut... Schießen, das funktioniert auch. Sie haben veröffentlichen Sie Ihren code, damit wir sehen können, welche Muster Sie verwenden, dass
dill
(undpickle
) fehlschlägt. Ich weiß, dass ein Modul importieren, die anderen, die nicht "installiert" (d.h. in einem lokalen Verzeichnis) und erwarten, dass die Serialisierung zu "einfach funktionieren" nicht für alle Fälle.Sehen
dill
Fragen:https://github.com/uqfoundation/dill/issues/128
https://github.com/uqfoundation/dill/issues/129
und dies SO Frage:
Warum dill-dumps externe Kurse, die durch Verweis, egal was?
einige Beispiele für Fehler und mögliche Abhilfen.
BEARBEITEN mit Bezug zu aktuellen Frage:
Ich nicht sehen, Ihr Problem. Die über die Befehlszeile ausgeführt, Import aus den interpreter (
import test_serialization
), und der Skript-Ausführung im interpreter (wie unten angegeben und in deiner Schritte 3-5) arbeiten. Das führt mich zu denken, verwenden Sie möglicherweise eine ältere version vondill
?BEARBEITEN basierend auf der Diskussion in den Kommentaren:
Aussieht, ist es wahrscheinlich ein Problem mit Windows, wie es zu sein scheint, dass der einzige OS der Fehler angezeigt wird.
BEARBEITEN nach einigen arbeiten (siehe: https://github.com/uqfoundation/dill/issues/140):
Verwendung dieses minimal-Beispiel kann ich reproduzieren die gleichen Fehler auf Windows, während auf MacOSX funktioniert es noch...
und
Jedoch, wenn Sie
open(path, 'r') as _f
es funktioniert auf Windows und MacOSX. So wie es aussieht die__import__
auf Windows ist empfindlicher auf die Datei-Typ als auch auf nicht-Windows-Systemen. Dennoch werfen eineImportError
ist komisch... aber diese kleine änderung sollte es funktionieren.README
. Bitte lassen Sie mich wissen, wenn etwas zu klären. Auf meinem computer, läuft der test wie angewiesen UrsachenImportError: No module named test_environment
, ob ich mich mitpickle
oderdill
. Endlich, vielen Dank fürdill
!dill
und im Grunde verwenden Sie es für alles, was ich kann jetzt istFalls jemand das gleiche problem, ich hatte das gleiche problem mit Python 2.7 und das problem war die pickle-Datei erstellt, auf die windows während ich mich mit Linux, was ich zu tun hatte, läuft dos2unix, die heruntergeladen werden, zuerst mit
Und dann müssen Sie konvertieren Sie das pickle-Datei Beispiel