`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:


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 von dill 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 den dump laufen und die load?
  • (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, dass test_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, wo test_serialization.py gespeichert in zwischen läuft (nicht sicher, ob die Interpretation Frage richtig)
  • Ich verwendet pip zu installieren dill, 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 Stamm dill seit der Veröffentlichung von 0.2.4 und Installation von github 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 oder pip 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, mit dill.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 ich dill.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 die dill.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

InformationsquelleAutor user89 | 2015-11-28
Schreibe einen Kommentar