os.getcwd()vs os.path.abspath(os.path.dirname(__ file __))

时间:2012-06-30 12:22:53

标签: python django

我正在使用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'),
)

设置为os.getcwd()的SITE_ROOT似乎使Django在settings.py文件

上方的目录中查找模板文件夹

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

有人知道吗?

4 个答案:

答案 0 :(得分:43)

正如穆阿德所说,os.getcwd()不会完全满足你所期待的。

os.getcwd()比返回当前工作目录更多。它在您的环境中默认为$ 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__ attribute。此外,从Python3.4开始__file__应始终是绝对路径。

答案 1 :(得分:6)

命令os.path.abspath(os.path.dirname(__file__))返回存储代码文件的目录,但os.getcwd()为您提供当前工作目录,默认情况下执行代码,后者可以使用os.chdir()命令。

答案 2 :(得分:3)

os.getcwd() 会为您提供settings.py所在的路径,而是会为您提供脚本所在的路径(在您的情况下为manage.py} )被执行。

答案 3 :(得分:1)

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