【问题标题】:os.getcwd() vs os.path.abspath(os.path.dirname(__file__))os.getcwd() 与 os.path.abspath(os.path.dirname(__file__))
【发布时间】:2012-06-30 12:22:52
【问题描述】:

我正在使用 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(),并且我的网站运行良好,但我很好奇这里会发生什么:)

有人知道吗?

【问题讨论】:

  • 当前工作目录和__file__ 无关。第一个可以改变,取决于你从哪里运行程序以及你是否在其中使用os.chdir,另一个只取决于模块在文件系统中的位置。

标签: python django


【解决方案1】:

正如 mouad 所说,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__ 应该始终是绝对路径。

【讨论】:

  • 嗯,好的,这对于 django 在哪里寻找模板非常有意义。谢谢
  • 请记住,__file__ 返回的内容并不总是绝对路径,因此您应该使用os.path.abspath 来确定。
  • @Loic Faure-Lacroix:很好的解释..谢谢你:-)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2016-11-19
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-12
        • 1970-01-01
        • 2014-09-28
        相关资源
        最近更新 更多