Python模块搜索路径中的当前目录不适用于django-admin

时间:2018-11-08 06:29:29

标签: python django

我正在研究Django settings上的文档。它提醒我们,设置模块应位于Python导入搜索路径上。因此,按照here中的建议,我在.bashrc中添加了以下两行:

-dell:~/Documents/DjangoTutorial$ tail -2 ~/.bashrc
export PYTHONPATH=$HOME/Documents/DjangoTutorial/mysite
export DJANGO_SETTINGS_MODULE=mysite.settings
-dell:~/Documents/DjangoTutorial$ . ~/.bashrc

和“ django-admin runserver”可在任何地方工作,Python3.7中的sys.path显示:

>>> sys.path
['', '/home/Documents/DjangoTutorial/mysite', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

然后我读了article1article2,它们暗示“ sys.path”由以下内容组成:当前目录(表示为),PYTHONPATH,标准库和已安装的库。因此,我严格从PYTHONPATH目录中调用django-admin,但在./bashrc中注释掉了“ #export PYTHONPATH”,并得到了如下所示的错误:

-dell:~/Documents/DjangoTutorial/mysite$ django-admin runserver
Traceback (most recent call last):
...
**ModuleNotFoundError**: No module named 'mysite'

然后我检查了sys.path和''是否存在:

-dell:~/Documents/DjangoTutorial/mysite$ python3
>>> sys.path
['', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

我的问题是,在这种情况下,如果''等于PYTHONPATH,为什么它找不到设置模块?

1 个答案:

答案 0 :(得分:0)

来自sys.path definitionanother post

在程序启动时初始化,此列表的第一项路径[0]是包含用于调用Python解释器的脚本的目录。如果脚本目录不可用(例如,如果交互式调用解释器,或者从标准输入中读取了脚本),则路径[0]是空字符串,引导Python首先在当前目录中搜索模块。请注意,由于PYTHONPATH的结果,脚本目录已插入插入的条目之前

就我而言,

-dell:~/Documents/DjangoTutorial/mysite$ django-admin runserver

其中文件绝对路径为/ usr / local / bin / django-admin并以此名称列出

sys.path = [/usr/local/bin, ...]

而sys.path中未列出CWD =〜/ Documents / DjangoTutorial / mysite,因此无法找到〜/ Documents / DjangoTutorial / mysite下的模块“ mysite.settings”。

使用

export PYTHONPATH=/home/user/Documents/DjangoTutorial/mysite 

它之所以起作用,是因为它现在列在:

sys.path = [/usr/local/bin, /home/user/Documents/DjangoTutorial/mysite, ...]

这就是为什么在django-admin上推荐manage.py的原因,因为它的路径与导出PYTHONPATH的路径相同,并且即使在没有设置$ PYTHONPATH的情况下,也可以在任何地方运行它,如下所示。

-dell:~/Documents/DjangoTutorial% mysite/manage.py runserver --noreload
sys.path = [
/home/user/Documents/DjangoTutorial/mysite # CWD = manage.py's path
/home/user/Documents/DjangoTutorial/mysite # export $PYTHONPATH's
...]