2012-06-30 22 views
31

Tôi đang sử dụng mô-đun os để có đường dẫn tương đối trong các dự án Django của tôi settings.py tệp. Biến SITE_ROOT được đặt thành thư mục làm việc hiện tại của tệp settings.py và sau đó được sử dụng để tham chiếu tất cả các thư mục static/media cũng nằm trong cùng thư mục đó.os.getcwd() vs os.path.abspath (os.path.dirname (__ file__))

Heres vấn đề của tôi:

print os.getcwd() 
print os.path.abspath(os.path.dirname(__file__)) 

Trong settings.py, các báo cáo trên đều có kết quả đầu ra giống hệt nhau. nhưng mẫu của tôi sẽ chỉ tải nếu tôi sử dụng SITE_ROOT = os.path.abspath(os.path.dirname(__file__))

Django tìm kiếm các mẫu ở đây:

TEMPLATE_DIRS = (
    os.path.join(SITE_ROOT, 'templates'), 
) 

SITE_ROOT thiết lập để os.getcwd() dường như làm cho Django tìm kiếm thư mục templates trong thư mục TRÊN file settings.py

Tôi có thể dễ dàng không sử dụng os.getcwd() và trang web của tôi chạy tốt, nhưng tôi tò mò điều gì có thể xảy ra ở đây :)

Có ai biết không?

+0

Thư mục làm việc hiện tại và '__file__' không liên quan. Việc đầu tiên có thể thay đổi, tùy thuộc vào nơi bạn chạy chương trình của bạn từ và cho dù bạn sử dụng 'os.chdir' bên trong, khác chỉ phụ thuộc vào nơi mà các mô-đun được đặt trong hệ thống tập tin. –

Trả lời

32

Như mouad đã nói, os.getcwd() sẽ không cung cấp cho bạn chính xác những gì bạn đang mong đợi.

os.getcwd() không hơn một chút so với trả lại thư mục làm việc hiện tại. Nó mặc định là $ PWD trong env của bạn. Nó không phải là nơi mà các kịch bản được đặt nhưng bạn đang ở đâu khi bạn thực hiện kịch bản.

Đang /home/user và làm python manage.py, os.getcwd() sẽ trở lại /home/user Đang /home/ và làm python user/manage.py, os.getcwd() sẽ trở lại /home

Nhưng nó vẫn sẽ không phải luôn luôn đúng vì nó có thể sử dụng os.chdir(). Nó là một từ khác như làm cd. Nó cũng sẽ thay đổi giá trị trả lại là os.getcwd().

Mặt khác. __file__ là đường dẫn của tệp của mô-đun. Vì vậy, bạn phải sử dụng điều này để chắc chắn có một đường dẫn liên quan đến module của bạn thay vì thư mục làm việc hiện tại có thể thay đổi.

Như ShawnFumo đã nói, __file__ không phải lúc nào cũng tuyệt đối. Để có ý tưởng tốt hơn về cách hoạt động, bạn có thể kiểm tra câu trả lời đó: Python __file__ attribute. Ngoài ra, như của Python3.4 __file__ phải luôn luôn là một đường dẫn tuyệt đối.

Hy vọng điều đó rõ ràng.

+0

AH ok, có ý nghĩa hoàn hảo với nơi django đang tìm mẫu. THanks – darko

+5

Hãy nhớ rằng những gì '__file__' trả về không phải luôn luôn là một đường dẫn tuyệt đối, do đó bạn nên sử dụng' os.path.abspath' trên nó để chắc chắn. – ShawnFumo

+0

@Loic Faure-Lacroix: Lời giải thích tuyệt vời..Cảm ơn bạn :-) –

0

Nếu hai câu lệnh bạn hiển thị thực sự có cùng đầu ra, thì một trong hai báo cáo sẽ hoạt động. Vì vậy, hoặc: 1) chúng khác nhau một cách tinh tế, ví dụ, một cái có dấu gạch chéo, cái còn lại không, hoặc 2) bạn đang thử nghiệm trong một môi trường và chạy trong một môi trường khác.

2

os.getcwd() sẽ không cung cấp cho bạn đường dẫn nơi settings.py tọa lạc thay vì nó sẽ cung cấp cho bạn con đường từ nơi kịch bản (trong trường hợp của bạn manage.py) được thực thi.

4

Lệnh os.path.abspath(os.path.dirname(__file__)) trả về thư mục chứa tệp mã, nhưng os.getcwd() cung cấp cho bạn thư mục làm việc hiện tại theo mặc định nơi mã được thực hiện, sau này có thể thay đổi bằng lệnh os.chdir().

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