【问题标题】:Current directory (os.getcwd) from within Django determined how?Django 中的当前目录(os.getcwd)如何确定?
【发布时间】:2015-01-29 15:20:12
【问题描述】:

我在 Python 2.7 上使用 Django 1.7,并注意到我的生产主机 (Webfaction) 与开发机器 (mac os x) 的奇怪行为。

在我的开发机器上,当我通过 cmds 获取当前工作目录时

import os
dirspot = os.getcwd()
print dirspot

我得到了 manage.py 可执行文件的位置。 当我在主机(webfaction)机器上执行此操作时,我会得到不同的响应,具体取决于 Django 站点是否正在运行,而不是使用 Django shell。

所以我的项目(和 manage.py)位于:

/home/ross/webapps/djangoarea/myproj

跑步

python manage.py shell

那么上面的 os.getcwd() 我就得到了

/home/ross/webapps/djangoarea/myproj

但如果我将相同的命令放入 views.py 并运行我的项目,我会得到 ​​p>

/home/ross/

我猜这可能与运行 django 的 apache2 和 wsgi 有关,而不是与调用它的 manage.py 有关。有谁知道如何让这个保持一致?

提前致谢, 罗斯。

【问题讨论】:

    标签: python django webfaction


    【解决方案1】:

    不确定您到底要做什么,但正如您所发现的,os.getcwd() 与文件或脚本的位置没有任何关系,它与您执行脚本的位置有关。由于多种原因,这并不可靠——例如,可能在主机上,您的 Web 进程作为与脚本所有者完全不同的用户运行。如果您想获取与您的文件相关的内容,您可能需要使用os.path.abspath(os.path.dirname(__file__))os.path.realpath(path)

    https://docs.python.org/3.3/library/os.path.html#os.path.realpath

    【讨论】:

    • 感谢您的建议。在 Django 中,“脚本”是 manage.py 可执行文件,所以我认为那里应该有一个一致的结果来指示它的位置。但是,没有问题 - 阅读 abspath 和 realpath,这看起来不错,所以使用它,效果很好。有趣的是,在 manage.py shell 中,需要引用下划线文件引用,否则它将不起作用。 (我明白了,这里不能输入,因为下划线被删除了):)
    【解决方案2】:

    以防万一有人觉得它有用。 您可以查看您的工作目录,或使用 request.django 直接打印工作目录。这种行为似乎可以满足框架的请求,尽管我不确定它是否适用于常规 django 请求。

    def some_view(self, request, *args, **kwargs):
        request.META.get('pwd')
    

    希望对大家有用

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      相关资源
      最近更新 更多