【问题标题】:Why os.path.dirname(__file__) is working in Django? [duplicate]为什么 os.path.dirname(__file__) 在 Django 中工作? [复制]
【发布时间】:2014-09-28 03:36:03
【问题描述】:

请解释为什么os.path.dirname(__file__) 在 Django 中工作,但在 python 中不工作? 这是一种我无法理解的奇怪情况。

我制作了一个python脚本并将其放入文件test_file.py中:

import os

dirname = os.path.dirname(os.path.dirname(__file__))
realpath = os.path.dirname(os.path.realpath(__file__))
abspath = os.path.dirname(os.path.abspath(__file__))

print dirname
print realpath
print abspath

当我运行脚本时,我会得到结果:

(env)user@ubuntubox:~/srv/django_pro$ python test_file.py 

/home/srv/django_pro
/home/srv/django_pro
(env)user@ubuntubox:~/srv/django_pro$

我得到 realpathabspath 工作的结果,但 dirname 为空。但是在 Django settings.py 我有:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))

如果我进入python shell并打印出BASE_DIR,它不为空:

(env)user@ubuntubox:~/srv/django_pro$ python manage.py shell
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.conf import settings
>>> 
>>> print 'BASE_DIR:\n%s' % settings.BASE_DIR
BASE_DIR:
/home/srv/django_pro
>>> 

这意味着 os.path.dirname(os.path.dirname(file)) 不为空。在这两种情况下,我都使用相同的 python。而我的 Django 版本是:

Django==1.7b4

那么诀窍是什么?

【问题讨论】:

  • 在 Django 中工作但不在 python 中?这甚至意味着什么?
  • 是的。在 Django 中工作,但不在 Python 中。
  • @Martijin Pieters 来了。现在一切都会好起来的 :-) 我在 Python 中遇到的每一个问题都得到了他的解答 :-)
  • Django Python。 “在 Django 中工作而不是在 Python 中工作”是完全无意义的说法。
  • 老实说,我正在阅读这些答案,但我没有发现这是一个重复的问题。我相信对于许多 python 初学者来说,可能会出现这样的问题。很遗憾它被标记为重复,但感谢您的回答。我会尽可能接受。

标签: python django python-2.7


【解决方案1】:

您运行的第一个脚本__file__ 设置为您传递给Python 的路径。您使用python test_file.py 启动脚本,因此__file__ 设置为'test_file.py'。如果您使用python /home/srv/django_pro/test_file.py,您的测试脚本将显示所有三个选项的路径。

另一方面,导入的模块将其__file__ 值设置为完整路径

您需要考虑到这一点并始终使用os.path.abspath

directory = os.path.dirname(os.path.abspath(__file__))

【讨论】:

  • 感谢@Martijn Pieters 的回答。所以诀窍是导入的模块将它们的 file 值设置为完整路径。好的,很高兴知道。我用完整路径运行脚本,得到了答案:/home/srv, /home/srv/django_pro/home/srv/django_pro。从现在开始,我将在 Django 中使用 os.path.abspath(file)。
  • os.path.abspath 在上面的代码中对我来说似乎是多余的,因为正如您所说,在模块内部无论如何都会返回绝对路径。
  • @h4k1m:但不在脚本中。关键是这段代码可以任意使用。
猜你喜欢
  • 1970-01-01
  • 2016-11-19
  • 2012-06-12
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多