我正在研究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']
然后我读了article1和article2,它们暗示“ 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,为什么它找不到设置模块?
答案 0 :(得分:0)
来自sys.path definition和another 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
...]