Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 让烧瓶使用Python3(Apache/mod_wsgi)_Python 3.x_Flask_Mod Wsgi - Fatal编程技术网

Python 3.x 让烧瓶使用Python3(Apache/mod_wsgi)

Python 3.x 让烧瓶使用Python3(Apache/mod_wsgi),python-3.x,flask,mod-wsgi,Python 3.x,Flask,Mod Wsgi,我已经运行了一个基本的“hello world”烧瓶应用程序 我使用的是Ubuntu 14.04,使用的是Apache2.4。我已经安装了mod_wsgi 我已经创建了一个~/web/piFlask/venv/来保存一个安装了flask的virtualenv创建的Python2 但是,我希望让我的flaskapp导入我编写的Python3.x模块 我需要做些什么才能做到这一点 我尝试创建一个~/web/piFlask/venv3/并修改~/web/piFlask/piFlask.wsgi: im

我已经运行了一个基本的“hello world”烧瓶应用程序

我使用的是Ubuntu 14.04,使用的是Apache2.4。我已经安装了mod_wsgi

我已经创建了一个
~/web/piFlask/venv/
来保存一个安装了flask的virtualenv创建的Python2

但是,我希望让我的flaskapp导入我编写的Python3.x模块

我需要做些什么才能做到这一点

我尝试创建一个
~/web/piFlask/venv3/
并修改
~/web/piFlask/piFlask.wsgi

import os, sys

PROJECT_DIR = '/home/pi/web/piFlask'

activate_this = os.path.join(PROJECT_DIR, 'venv3/bin', 'activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
sys.path.insert(0, PROJECT_DIR)

from piFlask import app as application

application.debug = True
但我认为这还不够。这个.wsgi实际上是一个Python文件,将由mod_wsgi执行,我确信它将使用Py2.x解释器来执行

因此,如果我理解正确,mod_wsgi会启动系统Python来执行这个.wsgi,这将反过来启动我的
~/web/piFlask/venv/
解释器来实际处理请求

我想我可以说服mod_wsgi使用系统Python3或我自己的venv3/。。。通过在/etc/apache2/mods available/wsgi.conf中设置
WSGIPythonPath/home/pi/web/piFlask/venv3/lib/python3.4/site包


但是我在某个地方发现一条指令,说您必须为Py3编译mod_wsgi,而问题很快就解决了。

正确,mod_wsgi需要为特定的Python版本编译,因为它从来没有实际执行过“Python”可执行文件。相反,Python库链接到mod_wsgi

最终的结果是,您不能在使用Python2解释器运行的应用程序中混合使用Python3代码


你必须考虑让你的代码在Python 2和3下运行,然后你可以选择你想要使用的那些版本,并使用MODYWSGI版本来编译你选择使用的版本。

花了我一段时间,尽管最终很简单。不幸的是,我丢失了我的bash历史记录,因此如果您发现错误,请在更正中留下评论或编辑

注意,我已经让mod_wsgi工作了,所以我必须删除它:

$ a2dismod wsgi
$ sudo apt-get remove libapache2-mod-wsgi
编辑:由于apt get安装了一个过时的软件包(这会导致一个小错误潜入Apache的错误日志),在撰写本文时,我不建议这样做:

$ sudo apt-get install libapache2-mod-wsgi-py3
$ a2enmod wsgi
相反,首先设置py3虚拟环境(最好在运行时将Flask安装到其中)

现在,按照下面的步骤将mod_wsgi安装到这个venv中,然后

$ deactivate                      #  ... & exit
这是最初的apt get方法,现在与此无关:

现在我必须让mod_wsgi使用这个新的Py3:

$ sudo nano /etc/apache2/mods-enabled/wsgi.conf
并且做:

#WSGIPythonPath directory|directory-1:directory-2:...
WSGIPythonPath /home/pi/web/flaskapp/venv3/lib/python3.4/site-packages
最后,我需要修改我的~/web/flaskapp/flaskapp.wsgi,以便它现在支持Python3:

$ cat web/piFlask/piFlask.wsgi

# http://flask.pocoo.org/docs/0.10/deploying/mod_wsgi/#creating-a-wsgi-file
# http://www.enigmeta.com/2012/08/16/starting-flask/

# for Py3:
# http://askubuntu.com/questions/488529/pyvenv-3-4-error-returned-non-zero-exit-status-1

import os, sys

PROJECT_DIR = '/home/pi/web/flaskapp'
sys.path.insert(0, PROJECT_DIR)


def execfile(filename):
    globals = dict( __file__ = filename )
    exec( open(filename).read(), globals )

activate_this = os.path.join( PROJECT_DIR, 'venv3/bin', 'activate_this.py' )
execfile( activate_this )


from piFlask import app as application
application.debug = True
提醒您,当用户将其浏览器指向以下位置时,Apache如何使用mod_wsgi执行此文件:

$cat/etc/apache2/sites available/000-default.conf
:
WSGIDaemonProcess flaskProcess user=pi group=pi threads=5
WSGIScriptAlias/flask/home/pi/web/flaskapp/flaskapp.wsgi
WSGIProcessGroup烧瓶工艺
WSGIApplicationGroup%{GLOBAL}
要求所有授权
:
讨论:我将mod_wsgi模块安装到Apache中似乎有点混乱,但它驻留在我的flaskapp文件夹中的venv3中。但这至少确保了Apache->mod_wsgi->(使用正确的即venv3 Python)->{启动我的FlaskApp}


另一种方法是更新系统Python,并使用它代替venv。

我开始在Ubuntu16.04(虚拟机)上的venv中运行python3.5.2和flask 0.12

@Graham指出,从WSGI脚本文件激活venv不是首选方法。更多信息请点击此处:

对于任何想了解这方面信息的人,我将把你的所有步骤放在一起:
注意:我的应用程序名为blazing,路径~/jan/blazing。用你自己的替换它们

输出:
LoadModule wsgi_module”/usr/lib/apache2/modules/module_wsgi-py35.cpython-35m-x86_64-linux-gnu.so“
WSGIPythonHome“/家庭/jan/blazing/venv”

添加:LoadModule wsgi_module“/usr/lib/apache2/modules/module_wsgi-py35.cpython-35m-x86_64-linux-gnu.so”

加:

然后

加:

加:


摘自PI的答案。下面的操作现在起作用并修复了该问题:

$ sudo apt-get install libapache2-mod-wsgi-py3
$ a2enmod wsgi

我要瞄准蟒蛇3号。看起来好像有
libapache2-mod-wsgi-py3
——我可以改为:1。a2禁用mod_wsgi,2。使用pip 3卸载mod_wsgi。使用pip3安装libapache2-mod-wsgi-py3?是。只要您的所有代码和所需的任何第三方Python模块都支持Python 3。一切都需要安装在Python3虚拟环境中。您不能将来自不同Python版本的虚拟环境的部分混合使用。建议您阅读有关使用虚拟环境的首选方法的信息。从WSGI脚本文件激活它不是首选方法。您也不需要关闭
WSGIRestrictStdout
,因为这是默认设置。非常感谢您的帮助。我花了很多时间试图找到一种在Python3上运行mod_wsgi的方法。我不知道的是Python3有一个特定的版本。竖起大拇指
$ cat /etc/apache2/sites-available/000-default.conf
:
WSGIDaemonProcess flaskProcess user=pi group=pi threads=5
WSGIScriptAlias /flask /home/pi/web/flaskapp/flaskapp.wsgi

<Location /flask>
    WSGIProcessGroup flaskProcess
    WSGIApplicationGroup %{GLOBAL}
    Require all granted
</Location>
:
sudo apt install python3-pip

sudo apt-get install python3-venv
python3 -m venv ~/blazing/venv
source /home/jan/blazing/venv/bin/activate

pip3 install --upgrade pip    
pip3 install Flask

sudo apt-get install apache2-dev
(venv) pip3 install mod_wsgi
(venv) sudo venv3/bin/mod_wsgi-express install-module
sudo vim /etc/apache2/mods-available/wsgi_express.load
sudo vim /etc/apache2/mods-available/wsgi_express.conf
WSGIPythonHome "/home/jan/blazing/venv"
WSGIPythonPath /home/jan/blazing/venv/lib/python3.x/site-packages
sudo a2enmod wsgi_express

vim /home/jan/blazing/project/flaskapp.wsgi
import os, sys

PROJECT_DIR = '/home/jan/blazing' sys.path.insert(0, PROJECT_DIR)

activate_this = os.path.join( PROJECT_DIR, 'venv/bin', 'activate_this.py' )
with open(activate_this) as file_:
    exec(file_.read(), dict(__file__=activate_this)


from piFlask import app as application application.debug = True
vim /etc/apache2/sites-available/flask.conf
WSGIDaemonProcess flaskProcess user=www-data group=www-data threads=5
WSGIScriptAlias /flask /home/jan/blazing/project/flaskapp.wsgi

ErrorLog ${APACHE_LOG_DIR}/error_flask.log #you can see the errors here..
CustomLog ${APACHE_LOG_DIR}/access_flask.log combined

<Location /flask>
    WSGIProcessGroup flaskProcess
    WSGIApplicationGroup %{GLOBAL}
    Require all granted
</Location>
<VirtualHost *>
    ServerName flask.ubuntuws
    ErrorLog ${APACHE_LOG_DIR}/error_flask.log
    CustomLog ${APACHE_LOG_DIR}/access_flask.log combined

    WSGIDaemonProcess flaskProcess user=www-data group=www-data threads=5
    WSGIScriptAlias / /home/jan/blazing/project/flaskapp.wsgi

    <Location />
        WSGIProcessGroup flaskProcess
        WSGIApplicationGroup %{GLOBAL}
        Require all granted
    </Location>
</VirtualHost>
sudo a2ensite flask.conf
sudo service apache2 reload
$ sudo apt-get install libapache2-mod-wsgi-py3
$ a2enmod wsgi