Difference between revisions of "Short Notes on Python"

From PaskvilWiki
Jump to: navigation, search
(Setting Up uWSGI)
(uWSGI, nginx, Flask)
Line 60: Line 60:
* remove the "protocol" directive from ''wsgi.ini'', and add "die-on-term":
* remove the "protocol" directive from ''wsgi.ini'', and add "die-on-term":
module          = wsgi:app
module          = main:app
master          = true
master          = true
processes      = 5
processes      = 5

Revision as of 13:28, 15 September 2016

Timing, and memory, on Linux


On Linux, it's safer to use time.time()

import time
t = time.time()
# do some stuff
print "stuff took %1.3f", time.time() - t, "seconds"

On Windows, AFAIK, it's safer to use time.clock()


For me, the following does a good job getting memory usage (in kB) on Linux:

import resource
print resource.getrusage(resource.RUSAGE_SELF).ru_maxrss

Since resource is standard package, it should work on Windows too, but I don't know if it does, or what units are used if it works.

Importing Files

If you need to import a file '../mylib/commons.py', you can use the following snippet:

import sys, os
fld = os.path.realpath(os.path.abspath(os.path.join('..', 'mylib')))
if fld not in sys.path:
    sys.path.insert(0, fld)
import commons

# use your commons.py module now...

uWSGI, nginx, Flask

  • install uwsgi (incl. uwsgi python plugin), python flask, and nginx,

Setting Up uWSGI

  • create main.py file that will hold the server logic, for instance:
from flask import Flask

app = Flask(__name__)

def hello():
    return "hello there!"
  • create uwsgi config file, wsgi.ini (minimal version here; read uwsgi docs for head-spinning array of configurables):
module          = main:app
master          = true
processes       = 5
socket          =
protocol        = http
plugin          = python
  • run uwsgi
uwsgi --ini wsgi.ini

Adding nginx Layer

  • remove the "protocol" directive from wsgi.ini, and add "die-on-term":
module          = main:app
master          = true
processes       = 5
socket          =
plugin          = python
die-on-term     = true
  • add a new vhost to nginx - /etc/nginx/sites-available/app.nginx:
server {
    listen 80;
    server_name my.awesome.domain;
    location / {
        include uwsgi_params;
    • communication through socket is also possible (see socket, chmod-socket, vacuum and other directives for uWSGI)
    • of course, create link in /etc/nginx/sites-enabled/, and restart nginx,

Run uWSGI daemon on boot

  • create systemd file for uWSGI, /etc/systemd/system/uwsgi-app.service:
Description=Job that runs the uWSGI app

ExecStart=/usr/bin/uwsgi --ini wsgi.ini


Then you can start and stop the uwsgi service using:

# systemctl start uwsgi-app.service
# systemctl stop uwsgi-app.service

Once you're happy with the settings, enable the daemon to be run on boot:

# systemctl enable uwsgi-app.service