44

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

ここに私の問題があります:

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

settings.py では、上記のステートメントはどちらも同じ出力を持っています。しかし、私のテンプレートは、使用した場合にのみロードされますSITE_ROOT = os.path.abspath(os.path.dirname(__file__))

Django はここでテンプレートを探します。

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

SITE_ROOT を設定すると、Django はファイルos.getcwd()の上のディレクトリにあるテンプレート フォルダを探すようになりますsettings.py

私は簡単に使用できずos.getcwd()、私のサイトは正常に動作しますが、ここで何が起こっているのか興味があります:)

誰でも知っていますか?

4

4 に答える 4

55

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

os.getcwd()現在の作業ディレクトリを返すだけではありません。env のデフォルトは $PWD です。スクリプトの場所ではなく、スクリプトを実行したときの場所です。

にとって/home/userやっpython manage.pyos.getcwd()帰ってき ます./home/user/home/python user/manage.pyos.getcwd()/home

ただし、 を使用できるため、常に真であるとは限りませんos.chdir()。つまり、やっているようなものcdです。の戻り値も変更されますos.getcwd()

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

ShawnFumo が言ったように、__file__常に絶対的であるとは限りません。それがどのように機能するかをよりよく理解するには、答えを確認してください: Python__file__属性. また、Python3.4 以降__file__は常に絶対パスにする必要があります。

于 2012-06-30T12:53:41.473 に答える
11

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

于 2012-06-30T12:54:07.587 に答える
4

os.getcwd()が配置されているパスを提供するのではなくsettings.py、スクリプト(あなたの場合manage.pyは)が実行される場所からのパスを提供します。

于 2012-06-30T12:30:12.850 に答える
1

表示する 2 つのステートメントの出力が本当に同じである場合は、どちらでも機能するはずです。したがって、1) それらは微妙に異なります。たとえば、一方には末尾のスラッシュがあり、もう一方にはありません。または 2) ある環境でテストし、別の環境で実行しています。

于 2012-06-30T12:28:55.203 に答える