我正在尝试设置uWSGI来运行一个简单的Flask应用程序。我跟着this tutorial一起工作,这很好,但是当我在项目中实现相同的概念时,它没有用。
这是我的目录结构:
.form-horizontal .control-label {
text-align: right;
margin-bottom: 0;
padding-top: 7px;
}
当我在/project
--/bin
----server.py
----wsgi.py
目录中时,python命令/project
正常工作。但是,uwsgi命令python bin/wsgi.py
没有。这是uwsgi --socket 0.0.0.0:8000 --protocol=http --wsgi-file bin/wsgi.py
:
server.py
这是from flask import Flask, jsonify, request
app = Flask(__name__)
# all my routes below...
:
wsgi.py
这是我得到的错误:
import os
from server import app as application
if __name__ == "__main__":
port = int(os.environ.get('PORT', 5000))
application.run(debug=True)
谢谢!
答案 0 :(得分:1)
为什么python bin/mod.py
有效?
因为Python将sys.path
设置为包含您的bin
目录,所以基于目录mod.py
(命令行参数)位于:
在程序启动时初始化时,此列表的第一项
path[0]
是包含用于调用Python解释器的脚本的目录。
您可以将import sys
和print(sys.path)
添加到wsgi.py
来查看。第一个元素是您的bin
目录(完整的绝对路径)。
为什么uwsgi --wsgi-file bin/wsgi.py
没有效果?
因为口译员不知道在哪里找server.py
。 uWSGI没有采用bin/wsgi.py
的路径,并未将其添加到嵌入式解释器的sys.path
(通过Py_SetProgramName
内部API调用,{{1}或者其他) - 它刚刚初始化了解释器并加载了文件。
基本上,uWSGI不是Python解释器,只是托管它,嵌入式。
如果脚本目录不可用(例如,如果以交互方式调用解释器或者从标准输入读取脚本),则路径[0]为空字符串,指示Python首先搜索当前目录中的模块。
为什么PySys_SetPath
解决了问题?
因为您告诉Python解释器在哪里查找导入的模块。 : - )