Skip to content
This repository has been archived by the owner on Jan 5, 2019. It is now read-only.

discontinue/pypyjs-examples

Repository files navigation

PyPy.js examples

Note: Development is sleeping at the moment. Discuss this here: pypyjs/pypyjs#213

This git repository contains some example usage of PyPy.js

It used the git repro https://github.com/pypyjs/pypyjs-release (and the no-JIT) as a git submodule.

Please fork and contribute own examples/snippets!

Small snippets:

Here some small snippets for copy&paste into PyPyJS-Editor.

Display some browser information from JavaScript object navigator:

import js
navigator = js.globals["navigator"]
for js_string in dir(navigator):
    attr_name = str(js_string) # FIXME
    attr = getattr(navigator, attr_name, "-")
    if not isinstance(attr, (js.String, js.Array, js.Boolean)):
        continue
    print "%20s: %s" % (attr_name, attr)

Create html buttons and bind the click event with jQuery:

import js # https://github.com/pypyjs/pypy/tree/pypyjs/pypy/module/js

jquery = js.globals["$"]
for i in range(10):
    jquery("#editor").before('<button id="button_%i">Click me %i!</button>' % (i,i))

@js.Function
def click_handler(event):
    print "You clicked on button with ID:",
    print event.target.id

jquery("button").click(click_handler)

print "Please click on new button above!"

Display information about a js object:

from __future__ import print_function
import js # https://github.com/pypyjs/pypy/tree/pypyjs/pypy/module/js

def pprint_js_object(obj):
    print("Object:", obj, type(obj), obj.__doc__)
    print("dir:", dir(obj))
    print("Existing object attributes:")
    for attr_name in obj:
        attr_name = str(attr_name) # convert js.String https://github.com/pypyjs/pypy/issues/2
        print("%30s:" % attr_name, end="")
        try:
            value = getattr(obj, attr_name)
        except Exception as err:
            print("[Error: %s]" % err)
        else:
            value = str(value) # evaluate js.Handle
            value = repr(value) # e.g. escape newlines
            if len(value)>70:
                value = "%s..." % value[:70]
            print(value)

window = js.globals.window
pprint_js_object(window)
print(" --- END --- ")

Some system information:

import os

methods=(
    "getlogin", "getuid", "getgid",
    "getpid", "getpgrp", "getppid",
    "geteuid", "getegid",
)
for method in methods:
    func = getattr(os, method)
    doc = func.__doc__.split("\n\n")[-1].strip()
    result = func()
    print "%12s: %-10s %s" % (method, result, doc)

Manipulating the virtual file system:

import os

LIB_PATH = "/lib/pypyjs/lib_pypy/"

with open(os.path.join(LIB_PATH, "my_module.py"), "w") as f:
     f.write("x='hi'")

import my_module

print my_module.x # hi
print "my_module.__file__:", my_module.__file__ # /lib/pypyjs/lib_pypy/my_module.py

import os
for filename in os.listdir(LIB_PATH): # Will list my_module.py and my_module.pyc
    if filename.startswith("my"):
        filepath = os.path.join(LIB_PATH, filename)
        print "*", filename, os.stat(filepath)

(Currently there is no public API for manipulating the virtual filesystem, see also: pypyjs/pypyjs#132 )

Existing examples:

Mandelbrot

Render Mandelbrot fractal in browser via PyPy.js

WIP:

minimal console

A minimal console with the aim to use as few external dependencies. A full featured console, that used jq-console is here: pypyjs.org

try out at home

There is a /simple_http_server.py for test this repro at home.

This is needed for 'mandelbrot' example and you can better see file requests.

Just do it e.g.:

~$ git clone https://github.com/pypyjs/pypyjs-examples.git
~$ cd pypyjs-examples
~/pypyjs-examples$ git submodule init
~/pypyjs-examples$ git submodule update
~/pypyjs-examples$ python simple_http_server.py

The server worked with Python 2 and 3 and starts at http://127.0.0.1:8000.

What is PyPy.js ?

In short: PyPy compiled to JavaScript

Little bit longer: PyPy.js is an experiment in building a fast and compliant in-browser python interpreter, by compiling PyPy into javascript and retargeting its JIT to emit javascript code at runtime.

More info: http://pypyjs.org/

Links

  • PyPyBox - create 2D graphics in pure Python

Repository Overview

pypyjs Main repository to built a PyPyJS release
pypy Fork of PyPy with support for compiling to javascript
pypyjs-release Latest release build of PyPyJS, as a handy git submodule
pypyjs-release-nojit Latest release build of PyPyJS, without a JIT
pypyjs-examples Examples/snippets usage of pypyjs-release and pypyjs-release-nojit
pypyjs.github.io source for pypyjs.org website use pypyjs-release and pypyjs-release-nojit

Releases

No releases published

Packages

No packages published