2016-05-25 10 views
1

Ich habe ein my_module Modul mit einer my_func() Funktion. Wenn ich diese Funktion im Elternprozess verwende, funktioniert alles gut (ich bekomme das korrekte Ergebnis von dieser Funktion). Aber wenn ich diese Funktion von Child-Prozessen aufrufen, bekomme ich diesen Fehler:Python Multiprocessing aufrufende Funktion von Modul

AttributeError: module 'my_module' has no attribute 'my_func' 

Weiß jemand, was ich falsch gemacht habe? Hier ist mein Template-Code:

import pandas as pd, gc, sys, multiprocessing as mp, traceback as tb 
sys.path.append('c:/my_libs/') 
import my_module 

def mp_func(df, i): 
    df['res'] = df.apply(lambda x: my_module.my_func(x, i)) 
    return df 

def other_function(df): 
    # do something 
    my_list = [1,2,3] # it can change dynamically based on previous code 

    df_res = pd.DataFrame() 

    mp_pool = mp.Pool(processes=min(len(my_list), mp.cpu_count())) 
    try: 
     for i_df in [y.get() for y in [mp_pool.apply_async(mp_func\ 
      , [df[['my_attr']], i]) for i in my_list]]: 

      df_res = df_res.append(i_df) 

    except Exception as e: 
     print('Something went wrong during multiprocessing:\n', e) 
     print('\nFull traceback:\n', tb.format_exc()) 

    finally: 
     mp_pool.close() 
     gc.collect() 

    df_res.to_csv(<...>)  

if __name__ == '__main__': 
    df = pd.read_csv(<...>) 
    other_function(df) 

Und my_module Modul sieht wie folgt aus:

def my_func(x, i): 
    return x * i 

Noch einmal, wenn ich das NICHT multiprocessed Version des gleichen Code ausführen dann alles gut funktioniert. (Ich benutze Python 3)

Vielen Dank!

+0

Hmm, dieser Vorlagencode funktioniert perfekt ... Mein realer Code ist zu groß, komplex und "privat" zu veröffentlichen, aber ich versuche herauszufinden, was der Fehler ist ... – ragesz

+0

Seltsam. Was passiert, wenn direkt nach Ihrer import-Anweisung sofort 'my_func' aufgerufen wird, werfen Sie einfach einen Wild-Parameter, z. 'my_func (1, 2)' - Sehen Sie, wenn Sie den gleichen Fehler bekommen. Löschen Sie my_module.pyc, um zu sehen, ob es hilft. –

+0

Vielen Dank für Ihren Tipp. Es hat nicht direkt geholfen, aber jetzt hatte ich etwas Zeit, um das Problem zu finden. – ragesz

Antwort

0

Endlich fand ich das Problem. Ich benutze Spyder, und darin wurde das Standardarbeitsverzeichnis auf einen anderen Ordner gesetzt, in dem ich eine vorherige Version meines Moduls hatte. Diese topic hat mir geholfen, den Pfad meiner importierten Module in den Child-Prozessen auszudrucken.

Verwandte Themen