我正在使用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()
并且我的网站运行良好,但我很好奇这里可能会发生什么:)
有人知道吗?
答案 0 :(得分:43)
正如穆阿德所说,os.getcwd()
不会完全满足你所期待的。
os.getcwd()
比返回当前工作目录更多。它在您的环境中默认为$ PWD。它不是脚本所在的位置,而是执行脚本时的位置。
进入/home/user
并执行python manage.py
,os.getcwd()
将返回/home/user
进入/home/
并执行python user/manage.py
,os.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)你在一个环境中测试并在另一个环境中运行。