2012-03-14 18 views
13

Chcę otworzyć plik z aplikacji Django przy użyciu open(). Problem polega na tym, że open() wydaje się używać dowolnego katalogu, z którego uruchamiam polecenie runserver jako root.Otwórz plik w aplikacji Django

E.g. jeśli mogę uruchomić serwer z katalogu o nazwie foo jak ten

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

open() wykorzystuje foo w katalogu głównym.

Jeśli mogę to zrobić zamiast

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

myapp będzie korzeniem.

Powiedzmy moja struktura folderów wygląda tak

foo/myapp/anotherapp 

Chciałbym, aby móc otworzyć plik znajdujący się foo/myapp/anotherapp ze skryptu również znajduje się w foo/myapp/anotherapp prostu mówiąc

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

teraz , w zależności od tego, z czego uruchamiam serwer, muszę powiedzieć:

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

lub

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

Odpowiedz

30

roztworze zostało opisane w pytaniu Favorite Django Tips&Tricks. Rozwiązanie jest następujące:

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

Co robi dokładnie to, o czym Pan wspomniał.

Ps. Proszę nie zastępować zmiennej file, jest to one of the builtins.

+1

Jeszcze raz dziękuję. Oczywiście Python nie jest moją normalną bronią z wyboru. –

+0

To było właśnie to, czego potrzebowałem do mojego własnego problemu. Dzięki! – odedbd

+0

Co, jeśli musisz zrobić krok wewnętrzny. mam na myśli co jeśli plik baz.txt znajduje się w jakimś folderze w module_dir, powiedzmy foo/baz.txt? – Clayton

1

Myślę, że znalazłem odpowiedź poprzez kolejne pytanie przepełnienie stosu (tak, nie szukaj zanim zadasz ...)

mam teraz zrobić

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

Po prostu: Możesz to również zrobić: 'import socket', następnie możesz użyć' socket.gethostname() 'do określenia nazwy hosta systemu, na którym jesteś. Skonfiguruj ścieżkę na podstawie zwracanej nazwy hosta. – Furbeenator

+3

@PaulHunter: Zamiast 'pwd + '/ baz.txt'' powinieneś użyć' os.path.join (pwd,' baz.txt ') '. – Tadeck

+0

Dzięki za to! –