2013-03-15 30 views
7

Tôi chạy top_level_script.py và có một ngoại lệ với một vết đống như:Ý nghĩa của/đường dẫn tương đối tuyệt đối trong python stack trace

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

ý rằng mmm/ttt/bbb/core.py có một đường dẫn tương đối trong khi khung trên và dưới nó có đường dẫn tuyệt đối . Ngoài ra, không có bản in ra khỏi dòng 17, trong __init__ và mã được gọi là "cũ". Tôi chỉ thay đổi nó, nhưng mã cũ đã được gọi. Do đó ngoại lệ.

Tôi vẫn thấy cơ chế nhập khẩu của Python đôi khi khó hiểu. Bất cứ ai có thể làm sáng tỏ những gì với core.py và những gì là ý nghĩa, nếu có, của con đường tương đối được hiển thị trong khung đó?

Sau khi một số tinkering, giả thuyết của tôi là python bằng cách nào đó đang gọi số .pyc (do đó không có nguồn nào được hiển thị trong dòng bên dưới). Sau khi mày mò với các tập tin (ví dụ: thay đổi và lưu nó), bây giờ tôi nhận được:

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

Bây giờ, tôi không thể tái tạo các hiệu ứng nhưng tôi vẫn tò mò nếu có ai biết được điều gì có thể xảy ra.

Trả lời

0

Nói chung, Python minh bạch cách nó hiểu tên của tệp.

Khi Python thực hiện import, biến môi trường PYTHONPATH được tham vấn và đặt biến số Python sys.path.

Thành phần đường dẫn trong sys.path có thể là tuyệt đối hoặc tương đối. Tên đường dẫn tương đối phổ biến là "." (thư mục làm việc hiện tại).

Nếu thực hiện nhập, tên được tìm thấy trong sys.path được dựa trên đường dẫn tương đối, sau đó tên tệp mà Python liên kết tên mô-đun cũng sẽ là tương đối. Tôi cũng nghĩ rằng nếu chương trình Python sử dụng relative import thì nó cũng xuất hiện dưới dạng tên tệp tương đối.

Thật đơn giản.

Các vấn đề liên quan