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 设置为os.getcwd()似乎使 Django 在文件上方的目录中查找模板文件settings.py

我可以很容易地不使用os.getcwd()并且我的网站运行良好,但我很好奇这里可能发生了什么:)

有人知道吗?

4

4 回答 4

55

正如 mouad 所说,os.getcwd()不会给你你所期望的。

os.getcwd()不仅仅是返回当前工作目录。它在您的环境中默认为 $PWD。这不是脚本所在的位置,而是您执行脚本时所在的位置。

正在/home/userpython 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

如果您显示的两个语句确实具有相同的输出,那么任何一个都应该工作。所以要么:1)它们有细微的不同,例如,一个有斜杠,另一个没有,或者2)你在一个环境中测试并在另一个环境中运行。

于 2012-06-30T12:28:55.203 回答