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

dar*_*rko 41 python django

我使用os模块在我的Django项目settings.py文件中有相对路径.变量SITE_ROOT设置为文件的当前工作目录,settings.py然后用于引用static/media同一目录中的所有目录.

继承人我的问题:

print os.getcwd()
print os.path.abspath(os.path.dirname(__file__))
Run Code Online (Sandbox Code Playgroud)

在settings.py中,上述语句都具有相同的输出.但我的模板只会在我使用时加载SITE_ROOT = os.path.abspath(os.path.dirname(__file__))

Django在这里寻找模板:

TEMPLATE_DIRS = (
    os.path.join(SITE_ROOT, 'templates'),
)
Run Code Online (Sandbox Code Playgroud)

SITE_ROOT设置os.getcwd()似乎让Django的查找模板文件夹的目录上面的settings.py文件

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

谁知道?

Loï*_*oix 46

正如穆阿德所说,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__属性.此外,从Python3.4开始__file__应始终是绝对路径.

  • 请记住,`__ file__`返回的并不总是绝对路径,所以你应该使用`os.path.abspath`来确定. (6认同)

luc*_*aba 7

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