2013-03-15 35 views
7

ho incontrato top_level_script.py e ottenuto un'eccezione con una traccia dello stack come:Significato assoluti/percorsi relativi a stack trace pitone

File "top_level_script.py", line 114, in main 
    … 
File "top_level_script.py", line 91, in func1 
    ... 
File "top_level_script.py", line 68, in func2 
    **kwargs) 
File "/home/max/.../cccc/ffff/mmmm.py", line 69, in some_func 
    obj = SomeClass(…) 
File "mmm/ttt/bbb/core.py", line 17, in __init__ 
File "/home/max/.../pppp/pppp.py", line 474, in func 
    ... 
File "/home/max/.../pppp/pppp.py", line 355, in some_func 
    ... 

noti che mmm/ttt/bbb/core.py ha un percorso relativo mentre il telaio sopra e sotto di essa hanno percorsi assoluti . Inoltre, non vi è alcuna stampa fuori linea 17, in __init__ e il codice chiamato era "vecchio". L'ho appena cambiato, ma il vecchio codice veniva chiamato. Da qui l'eccezione.

Trovo ancora confuso il meccanismo di importazione di Python. Qualcuno può chiarire cosa succede con core.py e qual è il significato, se esiste, del percorso relativo mostrato in quella cornice?

Dopo alcuni tentativi, la mia ipotesi era che Python in qualche modo chiamasse lo .pyc (quindi nessuna fonte mostrata nella riga sottostante). Dopo armeggiare con il file (vale a dire la modifica e il salvataggio), io ora ottenere:

File "top_level_script.py", line 114, in main 
    … 
File "top_level_script.py", line 91, in func1 
    ... 
File "top_level_script.py", line 68, in func2 
    **kwargs) 
File "/home/max/.../cccc/ffff/mmmm.py", line 69, in some_func 
    obj = SomeClass(…) 
File "/home/max/.../mmm/ttt/bbb/core.py", line 17, in __init__ 
    ... 
File "/home/max/.../pppp/pppp.py", line 474, in func 
    ... 
File "/home/max/.../pppp/pppp.py", line 355, in some_func 
    ... 

Ora, io non riesco a riprodurre l'effetto, ma io sono ancora curioso di sapere se qualcuno sa che cosa può essere accaduto.

risposta

0

In generale, Python è trasparente in modo da comprendere il nome del file.

Quando Python esegue un import, la variabile d'ambiente PYTHONPATH consultato e che imposta la variasble Python sys.path.

I componenti del percorso in sys.path possono essere assoluti o relativi. Un nome di percorso relativo comune è "." (l'attuale directory di lavoro).

Se nell'esecuzione dell'importazione, il nome trovato in sys.path è basato su un percorso relativo, il nome del file con cui Python associa il nome del modulo sarà anche relativo. Penso anche che se il programma Python usa un relative import, anche questo appare come un nome di file relativo.

È così semplice.

Problemi correlati