2012-03-14 25 views
13

Tôi muốn mở tệp từ ứng dụng Django bằng cách sử dụng open(). Vấn đề là open() dường như sử dụng bất kỳ thư mục nào mà từ đó tôi chạy lệnh runserver làm thư mục gốc.Mở tệp trong ứng dụng Django

Ví dụ: nếu tôi chạy máy chủ từ một thư mục gọi là foo như thế này

$pwd 
/Users/foo 
$python myapp/manage.py runserver 

open() sử dụng foo như thư mục gốc.

Nếu tôi làm điều này thay vì

$cd myapp 
$pwd 
/Users/foo/myapp 
$python manage.py runserver 

myapp sẽ là root.

Hãy nói rằng cấu trúc thư mục của tôi trông như thế này

foo/myapp/anotherapp 

Tôi muốn để có thể mở một tệp nằm ở foo/myapp/anotherapp từ một kịch bản cũng tọa lạc tại foo/myapp/anotherapp chỉ đơn giản bằng cách nói

file = open('./baz.txt') 

Bây giờ , tùy thuộc vào nơi tôi chạy máy chủ từ, tôi phải nói hoặc là

file = open('./myapp/anotherapp/baz.txt') 

hoặc

file = open('./anotherapp/baz.txt') 

Trả lời

30

Giải pháp đã được mô tả trong câu hỏi Favorite Django Tips&Tricks. Giải pháp như sau:

import os 
module_dir = os.path.dirname(__file__) # get current directory 
file_path = os.path.join(module_dir, 'baz.txt') 

Chính xác những gì bạn đã đề cập.

Ps. Vui lòng không ghi đè lên số file, là one of the builtins.

+1

Cảm ơn bạn lần nữa. Rõ ràng Python không phải là vũ khí bình thường của tôi. –

+0

Đây chỉ là những gì tôi cần cho vấn đề của riêng tôi. Cảm ơn! – odedbd

+0

Nếu bạn cần đi một bước bên trong. i có nghĩa là những gì nếu tập tin baz.txt là bên trong một số thư mục trong module_dir cho phép nói foo/baz.txt? – Clayton

1

Tôi nghĩ rằng tôi đã tìm thấy câu trả lời thông qua một câu hỏi stack overflow (vâng, tôi đã tìm kiếm trước khi hỏi ...)

bây giờ tôi làm điều này

pwd = os.path.dirname(__file__) 
file = open(pwd + '/baz.txt') 
+0

Chỉ cần thông tin: Bạn cũng có thể làm điều này: 'nhập socket', sau đó bạn có thể sử dụng' socket.gethostname() 'để xác định tên máy chủ của hệ thống bạn đang truy cập. Thiết lập đường dẫn của bạn dựa trên tên máy chủ được trả về. – Furbeenator

+3

@PaulHunter: Thay vì 'pwd + '/ baz.txt'' bạn nên sử dụng' os.path.join (pwd,' baz.txt ') '. – Tadeck

+0

Cảm ơn vì điều đó! –

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