2012-06-30 13 views
31

osモジュールを使用して、Djangoプロジェクトの相対パスをsettings.pyファイルにしています。変数SITE_ROOTは、settings.pyファイルの現在の作業ディレクトリに設定され、同じディレクトリにあるstatic/mediaディレクトリもすべて参照するために使用されます。os.getcwd()とos.path.abspath(os.path.dirname(__ file__))

HERESに私の問題:settings.pyで

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

、上記の文の両方が、同一の出力を有します。 os.getcwd()に設定

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

SITE_ROOTは、Djangoはsettings.pyファイル

上記のディレクトリにあるテンプレートフォルダを探し作るようだ:私は SITE_ROOT = os.path.abspath(os.path.dirname(__file__))

Djangoはここでテンプレートを探しますを使用している場合が、私のテンプレートにのみロードされます

私はちょうど同じように簡単にos.getcwd()を使用せず、私のサイトは正常に動作しますが、ここで何が起こっているのかも知りません:)

誰でも知っていますか?

+0

現在の作業ディレクトリと '__file__'は無関係です。最初はプログラムをどこから実行するか、 'os.chdir'を使うかどうかによってモジュールがファイルシステムに置かれる場所に依存します。 –

答えて

32

mouadが言ったように、os.getcwd()は、あなたが期待しているものを正確に与えるものではありません。

os.getcwd()現在の作業ディレクトリを返す以上のことはありません。あなたの環境では$ PWDにデフォルト設定されています。スクリプトの場所ではなく、スクリプトを実行したときの場所です。 /home/userにいるとpython manage.pyをやっ

os.getcwd()は、os.getcwd()/home

を返します/home/user/home/にいるとpython user/manage.pyをやって返しますが、それはまだだ、それはos.chdir()を使用することが可能ですので、常に真ではありません。言い換えれば、cdのようになります。また、戻り値はos.getcwd()に変更されます。一方、

一方、 __file__は、モジュールのファイルのパスです。したがって、変更する可能性のある現在の作業ディレクトリではなく、モジュールに相対的なパスを持つことを確実にするには、これを使用する必要があります。

ShawnFumo氏によると、__file__は必ずしも絶対的なものではないかもしれません。どのように動作するかについてより良い考えを得るには、答えを確認することができます:Python __file__ attribute。また、Python3.4以降では、__file__は常に絶対パスでなければなりません。

希望です。

+0

AH ok、それはdjangoがテンプレートを探しているところでは完璧です。 THanks – darko

+5

'__file__'が返すものは必ずしも絶対パスではないので、確実に' os.path.abspath'を使ってください。 – ShawnFumo

+0

@Loic Faure-Lacroix:素敵な説明..お元気ですか:-) –

0

本当に表示されている2つのステートメントの出力が同じ場合は、いずれかを実行する必要があります。したがって、1)微妙に異なります。たとえば、後にスラッシュがあり、もう1つがスラッシュでない、または2)ある環境でテストして別の環境で実行しているなどです。

2

os.getcwd()はあなたにsettings.pyが、それは(あなたのケースmanage.py中)スクリプトが実行されるところから、あなたにパスを与えるという置かれているパスを与えることはありません。

4

コマンドos.path.abspath(os.path.dirname(__file__))は、コードファイルが格納されているディレクトリを返しますが、os.getcwd()はデフォルトでコードが実行された現在の作業ディレクトリを提供します。os.chdir()コマンドを使用して後者を変更できます。

関連する問題