2010-11-15 14 views
21

Tôi có một mô-đun Python sử dụng một số tài nguyên trong thư mục con của thư mục mô-đun. Sau khi tìm kiếm xung quanh trên stack overflow và tìm câu trả lời liên quan, tôi quản lý để chỉ đạo các module để các nguồn lực bằng cách sử dụng một cái gì đó giống nhưLàm cách nào để sử dụng đường dẫn tương đối trong mô-đun Python khi CWD đã thay đổi?

import os 
os.path.join(os.path.dirname(__file__), 'fonts/myfont.ttf') 

này hoạt động tốt khi tôi gọi là mô-đun từ nơi khác, nhưng nó phá vỡ khi tôi gọi là mô-đun sau khi thay đổi thư mục làm việc hiện tại. Vấn đề là nội dung của __file__ là một đường dẫn tương đối, mà không đưa vào tài khoản thực tế là tôi đã thay đổi thư mục:

>>> mymodule.__file__ 
'mymodule/__init__.pyc' 
>>> os.chdir('..') 
>>> mymodule.__file__ 
'mymodule/__init__.pyc' 

Làm thế nào tôi có thể mã hóa các đường dẫn tuyệt đối trong __file__, hoặc chặn rằng, làm thế nào tôi có thể truy cập tài nguyên của mình trong mô-đun cho dù thư mục làm việc hiện tại là gì không? Cảm ơn!

Trả lời

39

Store đường dẫn tuyệt đối đến thư mục module vào đầu rất của các mô-đun:

package_directory = os.path.dirname(os.path.abspath(__file__)) 

Sau đó, tải các tài nguyên của bạn dựa trên này package_directory:

font_file = os.path.join(package_directory, 'fonts', 'myfont.ttf') 

Và sau khi tất cả, không sửa đổi các tài nguyên trên toàn bộ quy trình như thư mục làm việc hiện tại. Không bao giờ có nhu cầu thực sự để thay đổi thư mục làm việc trong một chương trình được viết tốt, do đó tránh được os.chdir().

+0

Cảm ơn, hoạt động hoàn hảo! Tôi cũng sẽ giữ cho nhận xét của bạn trong tâm trí để tránh thay đổi thư mục làm việc. – jvkersch

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