2013-03-15 8 views
7

został uruchomiony top_level_script.py i dostał wyjątek z śladu stosu, takich jak:znaczenie absolutnych/względem ścieżek na ścieżce pyton stosu

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 
    ... 

Należy zauważyć, że mmm/ttt/bbb/core.py ma względną ścieżkę, natomiast ramy, powyżej i poniżej, że mają ścieżki bezwzględne . Ponadto nie ma wydruku z linii 17, w __init__, a kod wywoływany był "stary". Właśnie to zmieniłem, ale stary kod został wywołany. Stąd wyjątek.

Nadal uważam, że mechanizmy importu Pythona są czasami mylące. Czy ktoś może wyjaśnić, co się dzieje z core.py i jakie jest znaczenie, jeśli w ogóle, względnej ścieżki pokazanej w tej ramce?

Po pewnym majsterkowaniu, moja hipoteza brzmiała, że ​​pyton w jakiś sposób nazywa się .pyc (stąd nie ma źródła pokazanego w poniższej linii). Po majstrować przy pliku (tzn zmienia i zapisywania go), teraz uzyskać:

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 
    ... 

Teraz nie mogę odtworzyć efekt, ale nadal jestem ciekawy, czy ktoś wie, co może się wydarzyć.

Odpowiedz

0

Ogólnie rzecz biorąc, Python jest przezroczysty, ponieważ rozumie nazwę pliku.

Gdy Python wykonuje import, jest sprawdzana zmienna środowiskowa PYTHONPATH i ustawia zmienną Python sys.path.

Składniki ścieżki w sys.path mogą być bezwzględne lub względne. Wspólna nazwa ścieżki względnej to "." (aktualny katalog roboczy).

Jeśli podczas importowania nazwa znaleziona w sys.path jest oparta na ścieżce względnej, to nazwa pliku, z którą Python wiąże nazwę modułu, będzie również względna. Myślę także, że jeśli program Python używa relative import, to również pojawia się jako względna nazwa pliku.

To takie proste.

Powiązane problemy