web-dev-qa-db-de.com

So erhalten Sie, dass Gunicorn Python 3 anstelle von Python 2 verwendet

Ich versuche Gunicorn dazu zu bringen, Python3 für eine Django-App zu verwenden, die ich erstellen möchte. Ich benutze das Django-Image von Digital Ocean, um zu beginnen. Es wird mit Django, Gunicorn und Nginx installiert und konfiguriert. Das standardmäßige Django-Projekt, das mit diesem Bild geliefert wird, scheint für Python 2 gut zu funktionieren.

Ich habe diese Pakete mit apt-get bearbeitet.

  • python3
  • python3-psycopg2
  • python3-dev
  • python3-Pip

Um zu versuchen, Probleme zu vermeiden, habe ich dies auch getan.

  • pip deinstallieren Django
  • pip3 installieren Django

Ich rm -rf 'habe das Aktienprojekt erstellt und mit Django-admin.py startproject Django_project ein neues erstellt. Django-admin.py verwendet Python 3 (laut Shebang). Später verwende ich python3 manage.py startapp Django_app, um eine neue App zu erstellen.

An diesem Punkt funktioniert alles gut. Genau wie die Standard-App. Dann mache ich das in Django_app/views.py und es bricht.

from Django.shortcuts import render
from Django.http import HttpResponse

def index(request):
    # Python 2 and 3 - works fine
    # print('PRINTING')

    # Python 3 only - crashes
    print(1, 2, end=' ')

    return HttpResponse("Hello, world! This is my first view.")

Die Fehlerseite besagt, dass ich Python 2.7.6 verwende.

Okay, also dachte ich, ich könnte Gunicorn durch pip für Python 3 installieren, also mache ich das.

  • pip deinstallieren gunicorn
  • pip3 installiere gunicorn

Aber dann lande ich einfach mit 502 Bad Gateway. Wenn ich service gunicorn status mache, erhalte ich gunicorn stop/waiting. Ich habe service gunicorn restart versucht, aber es wird immer noch gunicorn stop/waiting angezeigt.

Ich habe ein which gunicorn erstellt und es ist unter /usr/local/bin/gunicorn installiert. Ich bin nicht wirklich sicher, was ich sonst noch versuchen könnte. Jede Hilfe wäre sehr dankbar. Vielen Dank.

22
425nesp

Es ist wahrscheinlich einfacher, von vorne zu beginnen. Tutorial unter https://www.digitalocean.com/community/articles/how-to-install-and-configure-Django-mit-postgres-nginx-and-gunicorn .

Ich habe es auf einem frischen Ubuntu-14.04-Tropfen laufen lassen. Installiere python3 und Django und folge einfach dem Tutorial. Hat die Postgres oder Virtualenv Bits nicht gemacht.

7
wardk

Für den Fall, dass die beiden Links eines Tages abbrechen, habe ich es hier zum Laufen gebracht.

Start nach dem Ausführen dieser Anweisungen.

  • pip uninstall gunicorn
  • pip3 install gunicorn

Installieren Sie supervisor, Sudo apt-get install supervisor.

Als nächstes musste ich gunicorn_config.py im Stammverzeichnis meines Projektverzeichnisses erstellen, das dieses enthält.

command = '/usr/local/bin/gunicorn'
pythonpath = '/home/Django/django_project'
bind = '127.0.0.1:9000'
workers = 3
user = 'nobody'

Dann habe ich eine Konfigurationsdatei für supervisor erstellt. vim /etc/supervisor/conf.d/gunicorn.conf, mit diesen Inhalten.

[program:gunicorn]
command=/usr/local/bin/gunicorn -c /home/Django/django_project/gunicorn_config.py Django_project.wsgi
user=nobody
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn3.err.log
stdout_logfile=/var/log/gunicorn3.out.log

Danach habe ich einen supervisorctl reread und supervisorctl update gemacht und dann fing alles an zu arbeiten.

Mit supervisorctl status gunicorn können Sie überprüfen, ob gunicorn ausgeführt wird oder nicht. Sie können supervisorctl restart gunicorn verwenden, um neu zu starten.

19
425nesp

auf meine Art:

virtualenv -p /usr/bin/python3 /home/py3env
source /home/py3env/bin/activate
pip3 install gunicorn
/home/py3env/bin/gunicorn -w4 -b0.0.0.0:8000 [projectname].wsgi
6
snow

Schrieb das folgende Skript, um zu Python 3.4 mit DigitalOceans 14.04 Django image zu wechseln, da ich wollte, dass es ein nettes Ein-Schritt-Setup ist ... Das wird es wird unter https://Gist.github.com/tr00st/190ab4de62f9b23bea69 gepflegt

Das Hauptproblem bei der Einrichtung war für mich, dass der Wechsel zu Tornado für Arbeiter gut funktioniert hat.

#!/bin/bash
# Python 3 Upgrade for Django Droplet
# Will update the "Django on 14.04" Digital Ocean image.
# Run as root.

# Grab psycopg2 and pip
apt-get install python3-pip python3-psycopg2

# Remove the Python 2.7 version of gunicorn, so we can...
pip uninstall gunicorn

# Install the Python 3 version of gunicorn, and a couple of dependencies.
pip3 install gunicorn tornado Django
# Sadly, at time of writing, gevent isn't Python 3 compatible... But tornado is!
# So, switch them out with a little sed magic
sed 's/worker_class = '\''gevent'\''/worker_class='\''tornado'\''/' /etc/gunicorn.d/gunicorn.py -i.orig

# Restart gunicorn to make the changes take effect...
service gunicorn restart

# And we're good!
5
tr00st

Es scheint, dass es ein Paket dafür gibt, das gunicorn3 heißt (dies wurde auf Ubuntu getestet).

Sudo apt-get install gunicorn3

wenn Sie dann den folgenden Befehl ausführen, sollte Gunicorn mit Python3 ausgeführt werden:

gunicorn3 --log-level debug --bind 0.0.0.0:30443 server:app

3
papadp

Ich habe es geschafft, Gunicorn von überall zu deinstallieren:

Sudo apt-get remove gunicorn
pip uninstall gunicorn
pip3 uninstall gunicorn

Und dann gunicornvon source installieren.

pip3 install git+https://github.com/benoitc/gunicorn.git

Jetzt läuft alles ohne Probleme.

1
Alex Jolig

Wenn Sie sich die ausführbare Datei gunicorn ansehen, handelt es sich nur um ein kleines Python-Skript: 

$ cat gunicorn
#!/usr/bin/env python

# -*- coding: utf-8 -*-
import re
import sys

from gunicorn.app.wsgiapp import run

if __== '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(run())

Das wichtige Bit ist die Zeile from gunicorn.app.wsgiapp import run, die Ihnen den Speicherort des Modul-Verantwortlichen für die Ausführung Ihrer App angibt. Wenn es sich bei gunicorn um einen Qualitätscode handelt (was es ist), sollten Sie das Modul direkt von der Befehlszeile importieren und Ihre App ausführen können. 

"Importieren des Moduls direkt von der Befehlszeile" bedeutet die Verwendung des Befehlszeilenschalters -m

Beim Aufruf mit -m Modulname befindet sich das angegebene Modul im Python-Modulpfad und wird als Skript ausgeführt.

Verwenden Sie den Python Ihrer Wahl:

$ /path/to/your/python -m gunicorn.app.wsgiapp {{ gunicorn command line args go here }} server:app

Und sicher läuft es!

[2017-12-04 02:05:27 +0000] [24] [INFO] Starting gunicorn 19.7.1
[2017-12-04 02:05:27 +0000] [24] [INFO] Listening at: http://127.0.0.1:5000 (24)
[2017-12-04 02:05:27 +0000] [24] [INFO] Using worker: sync
[2017-12-04 02:05:27 +0000] [28] [INFO] Booting worker with pid: 28
[2017-12-04 02:05:27 +0000] [29] [INFO] Booting worker with pid: 29

Dieses Verhalten ist sehr nützlich, wenn Sie beispielsweise Gunicorn von einem Dockerfile ausführen. 

1
bcattle

So habe ich es geschafft, für mich zu arbeiten. Ich habe gunicorn sowohl mit pip2 als auch mit pip3 installiert. Ich brauche beide Versionen. Die Standardeinstellung ist gunicorn mit pip2.

Was ich getan habe, war, dass ich gunicorn mit virtualenv mit pip3 installiert habe und den Inhalt der Datei gunicorn unter bin im Ordner von virtualenv angesehen habe

#!/********/virtualenv/gunicorn3/corto/bin/python3

# -*- coding: utf-8 -*-
import re
import sys

from gunicorn.app.wsgiapp import run

if __== '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(run())

Ich habe diese Datei kopiert und an anderer Stelle abgelegt, dann habe ich mich geändert 

#!/********/virtualenv/gunicorn3/corto/bin/python3

zu 

#!/usr/bin/python3

Nun können Sie gunicorn einfach so ausführen, nachdem Sie in das Verzeichnis gelangen, in das Sie die Datei gunicorn kopiert haben

python3 gunicorn -c /your_config_file.py class_app:app

Hinweis: Wenn Sie pip3 deinstallieren, dann gunicorn und anschließend pip3 installieren, wird gunicorn gunicron mit der python3-Version (die die python2-Version überschreibt) im Verzeichnis 'usr/local/bin' (ubuntu) installieren. Anschließend können Sie den Dateiinhalt von gunicron dort herunterladen. So vermeiden Sie die Verwendung von Virtualenv.

Wenn dies beim ersten Mal nicht funktioniert, führen Sie pip3 unistall gunicorn aus, gefolgt von pip3 install gunicorn.

Glückliches Einhorn;)

0
eddys

Ich hatte das gleiche Problem auf Digital Ocean mit dem Droplet "Ubuntu Django on 14.04".

Ich erkannte, dass der Arbeitertyp 'gevent' für mich das Problem bei der Verwendung von Python 3 war. Obwohl ich mit python3 -m pip freeze überprüft habe, dass 'gevent' installiert war, funktionierte es nicht. Ich habe es in /etc/gunicorn.d/gunicorn.py in "sync" geändert:

...
worker_class = 'sync'
...

Ich habe gunicorn neu gestartet:

Sudo service gunicorn restart

Ich überprüfte, ob der Gunicorn-Dienst mit service gunicorn status ausgeführt wurde, und konnte die Begrüßung auf der Django-Seite über die IP-Adresse meines Droplets sehen.

Ich hoffe, das funktioniert bei anderen Leuten.

0
Yves

Ich denke, der beste Weg, dies zu tun, ist zu/usr/local/bin/gunicorn zu gehen und die erste Zeile zu ändern, die Shebang-Zeile in #!/Usr/bin/python-version ist

für ex: mein gunicorn läuft mit python3.5 interpretor

#!/usr/bin/python3.5

# -*- coding: utf-8 -*-
import re
import sys

from gunicorn.app.wsgiapp import run

if __== '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(run())
0
RVndra Singh

Installieren Sie eine virtuelle Python3-Umgebung in Ihrem Projektordner

$ pipenv --three

Dann gunicorn in der aktivierten Umgebung laufen lassen

$ gunicorn [PROJECT].wgsi
0
Dexios1