2016-07-29 31 views
1

nicht importieren Ich habe ein Jupyter-Notebook mit Python 3.5. Ich benutze es um Daten aus einer Simulation zu analysieren, die ich in Python geschrieben habe.Kann Python-Funktion in Jupyter

In der ersten Zelle, betreibe ich die Simulation mit

%run control.py 

und erhalte ich die Fehler

> ImportError        Traceback (most recent call 
> last) ...\code\control.py in 
> <module>() 
>  15 from supplier import Supplier 
>  16 from heatmap import create_heatmaps 
> ---> 17 from write2csv import get_dataframe_from_results, write_raw_data_from_simulation, get_aggregated_lines_per_run 
>  18 #write_aggregated_results, 
>  19 
> 
> ImportError: cannot import name 'get_dataframe_from_results' 

mein Programm auf mehrere Dateien aufgeteilt. Wenn ich die Methode 'get_dataframe_from_results' von den Importen entferne, funktioniert es. Diese Methode ist zusammen mit einigen anderen in der Datei/Modul write2csv.

Ich verstehe nicht, warum nur diese Methode nicht importiert werden kann. Alle anderen Funktionen aus dieser Datei können importiert werden, sodass ich ein Problem mit dem Speicherort des Quellordners ausschließe.

Die Funktion selbst enthält nichts aus dem Üblichen:

def get_dataframe_from_results(all_aggr_results): 
    # convert results to pandas data frame from nested dictionary 
    results_df = pd.Panel(all_aggr_results) 
    STRATS = ("AN", "RE") 
    RLZ = ("NOR", "DIS") 
    vlzlist = [] 
    for vlz in sorted(all_aggr_results): 
     outerlist = [] 
     for rl in RLZ: 
      concatlist = [] 
      for strt in STRATS: 
       concatlist.append(pd.DataFrame.from_dict(results_df[vlz][strt][rl], orient="index")) 
      outerlist.append(pd.concat(concatlist, keys=STRATS)) 
     vlzlist.append(pd.concat(outerlist, keys=RLZ)) 
    results = pd.concat(vlzlist, keys=sorted(all_aggr_results)) 
    results.index.names = ["A", "B", "C", "C"] 
    results["totalcost"] = results["AAA"] + results["BBB"] + results["CCC"] + results["DDD"] 
    results.reset_index(inplace=True) # transform multiindex to columns 

    return results 

Der einzige „Grund“, warum es etwas Besonderes sein könnte im Vergleich zu anderen Funktionen ist, dass es verwendet Pandas.

Wenn ich das Skript control.py in PyCharm ausführen, funktioniert es ohne Probleme. Wenn ich es von der Kommandozeile ausführen, bekomme ich

Fehler beim spec für 'control.py' zu finden (: Modul 'Kontrolle' hat kein Attribut 'Pfad')

Wenn ich die Funktion get_dataframe_from_results aus meinem Code weglasse, funktioniert es in Jupyter.

Wie kann ich diesen Fehler in Jupyter umgehen und habe meine Funktion?

Die Version des Notebook-Server 4.1.0 und läuft auf:

Python 2.7.11 | Anaconda 4.0.0 (64-Bit) | (Standard, 16. Februar 2016, 09.58.36) [MSC v.1500 64 Bit (AMD64)]

Aktuelle Kernel Information:

Python 3.5.1 | Anaconda 4.1.0 (64-Bit) | (Standard, 15. Juni 2016, 15:29:36) [MSC v.1900 64 bit (AMD64)]

Antwort

1

Dieses Problem tritt auf, wenn Sie den externen Code zur gleichen Zeit entwickeln (bearbeiten), zu der Sie den Jupyter entwickeln Notizbuch. Jupyter-Caching verhindert, dass die externe Datei nach dem ersten Import erneut geladen wird.

Die Lösung besteht darin, das externe Python-Cache-Verzeichnis __pycache__ zu löschen und dann das Jupyter-Notebook über den Menüeintrag "Kernel -> Restart and Clear Output" neu zu starten. Bei beiden wird Jupyter gezwungen, eine neue/neue Kopie der externen Datei zu lesen, wodurch neue Symbole und andere Änderungen erkannt werden.

(Ich weiß, Ihre Frage über ein Jahr alt ist. Aber nach dieser Ausgabe des ganzen Morgen heute kämpft, wollte ich sonst eine dokumentierte Antwort heraus für jedermann bekommen, die in diesen laufen.)