无法让gunicorn使用Python 3

6

我有一个安装了Python 3的虚拟环境,使用Ubuntu+NGINX+Gunicorn,但我的Flask应用仍在以2.7.6运行。尽管我已经按照指示进行了系统性的操作,但仍无法找到解决方法。

Gunicorn配置文件

[program:app-server]
command = gunicorn app:app -b localhost:8000
directory = /home/www/app-server
user = appuser

项目目录结构

app-server    
----app.py
----venv (virtual environment)

这看起来更像是一个 supervisord 配置文件,而不是 gunicorn 的配置文件。 - Martijn Pieters
你需要使用pip3(或者有时是pip3.4)进行安装。所以运行pip uninstall gunicorn(如果你不需要Python 2.6/2.7版本),然后运行pip3 install gunicorn。如果你忽略了卸载部分或者因为不是你独自的服务器而无法卸载,不用担心,只需运行which gunicorn -a。你正在使用的可能不是正确的版本。我之前曾经使用过类似于/opt/python-3.4.2/bin/gunicorn(在CentOS上)。我知道你说的是Ubuntu,但你永远不知道! - Jeremy
2个回答

9

尽管这个问题已经超过一年了,但我认为我应该加上我的回答,以防有人搜索到

使用文本编辑器打开此文件“/usr/bin/gunicorn”。在我的情况下,我使用vim带sudo来编辑文件

然后将python版本更改为python3,usr/bin/python2.7将变成usr/bin/python3

然后根据虚拟环境中安装的gunicorn版本,更改文件中的版本号,如果两者不相同。在我的情况下,文件中的版本号是17.0,但我安装的版本是19.6.0

请注意,在文件中有两个更改版本号的位置。

    #! /usr/bin/python3
    # EASY-INSTALL-ENTRY SCRIPT'gunicorn==17.5','console_scripts','gunicorn'
    __requires__ = 'gunicorn==19.6.0'
    import sys
    from pkg_resources import load_entry_point

    if __name__ == '__main__':
        sys.exit(
                  load_entry_point('gunicorn==19.6.0', console_scripts, 
                   'gunicorn')
                )

如果你想运行venv中安装的gunicorn,你应该在venv中运行gunicorn,而不是让系统安装的gunicorn看起来像venv版本。 - jla
@NikolayFrick,需要编辑库文件并不是一种优雅的解决方案。 - Corey Cole

9

Gunicorn本身是一个Python应用程序;Gunicorn PPA仅发布Python 2版本。

您应该将Gunicorn安装到Python 3中(使用pip,最好安装在您的虚拟环境中),并运行该版本:

/home/www/app-server/venv/bin/gunicorn

感到非常沮丧,无论我做什么都无法使其正常工作。在本地环境中它可以正常运行,但是当我部署时却不能正常工作。 - Keith Adler
@CatManDo:“不起作用”并不是一个很好的问题描述。您能否在远程服务器上手动启动虚拟环境中的Gunicorn服务器?如果不能,会发生什么情况?等等。 - Martijn Pieters
我正在使用NGINX作为反向代理,但是如果我在命令行中运行gunicorn app:app -b localhost:8000,这是我的应用程序正在使用的端口,当我调用sys.version时,我的应用程序仍然会打印出Python的2.7.6版本。 - Keith Adler
1
@CatManDo:但是仅使用gunicorn命令会运行系统安装的Gunicorn,而不是安装在您的虚拟环境中的那个。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接