Skip to content
A Python Interpreter written in Rust
Branch: master
Clone or download
coolreader18 Merge pull request #845 from RustPython/coolreader18/proc-macro-span-…
…errors

Target rustpython_derive errors at specific source spans
Latest commit 19be5c9 Apr 18, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
Lib comment out lines that reference mappingproxy as type doesn't yet have a Apr 14, 2019
benchmarks Add some benchmark scripts. Apr 17, 2019
derive Switch to span-based errors for pyclass and pyimpl Apr 16, 2019
docs Update builtins.md Feb 3, 2019
parser refactor lex byte Apr 18, 2019
py_code_object Migrated the project to the Rust 2018 edition Feb 14, 2019
src Format main.rs Apr 17, 2019
tests
vm Merge pull request #842 from RustPython/benchmarking Apr 18, 2019
wasm Improve syntax error with line information. Apr 17, 2019
.dockerignore
.gitignore add resources to snippets Apr 4, 2019
.travis.yml Add selenium test to travis Mar 15, 2019
Cargo.lock Fix order of dict literal Apr 5, 2019
Cargo.toml
Dockerfile.bin Create dockerfiles for the rustpython binary and wasm demo Jan 3, 2019
Dockerfile.wasm Create dockerfiles for the rustpython binary and wasm demo Jan 3, 2019
LICENSE Reshuffle some files Jul 7, 2018
README.md
azure-pipelines.yml
code-of-conduct.md Add a code of conduct Mar 7, 2019
demo.py
demo_closures.py readme and example change Sep 23, 2018
logo.png Add logo to README Mar 22, 2019
rustfmt.toml rust fmt Feb 26, 2019
whats_left.sh

README.md

RustPython

A Python-3 (CPython >= 3.5.0) Interpreter written in Rust 🐍 😱 🤘.

Build Status Build Status codecov License: MIT Contributors Gitter

Usage

Check out our online demo running on WebAssembly.

To test RustPython, do the following:

$ git clone https://github.com/RustPython/RustPython
$ cd RustPython
$ cargo run demo.py
Hello, RustPython!

Or use the interactive shell:

$ cargo run
Welcome to rustpython
>>>>> 2+2
4

Disclaimer

RustPython is in a development phase and should not be used in production or a fault intolerant setting.

Our current build supports only a subset of Python syntax.

Contribution is also more than welcome! See our contribution section for more information on this.

Goals

  • Full Python-3 environment entirely in Rust (not CPython bindings)
  • A clean implementation without compatibility hacks

Documentation

Currently along with other areas of the project, documentation is still in an early phase.

You can read the online documentation for the latest code on master.

You can also generate documentation locally by running:

$ cargo doc # Including documentation for all dependencies
$ cargo doc --no-deps --all # Excluding all dependencies

Documentation HTML files can then be found in the target/doc directory.

If you wish to update the online documentation, push directly to the release branch (or ask a maintainer to do so). This will trigger a Travis build that updates the documentation and WebAssembly demo page.

Code organization

  • parser/src: python lexing, parsing and ast
  • vm/src: python virtual machine
    • builtins.rs: Builtin functions
    • compile.rs: the python compiler from ast to bytecode
    • obj: python builtin types
  • src: using the other subcrates to bring rustpython to life.
  • docs: documentation (work in progress)
  • py_code_object: CPython bytecode to rustpython bytecode converter (work in progress)
  • wasm: Binary crate and resources for WebAssembly build
  • tests: integration test snippets

Contributing

Contributions are more than welcome, and in many cases we are happy to guide contributors through PRs or on gitter.

With that in mind, please note this project is maintained by volunteers, some of the best ways to get started are below:

Most tasks are listed in the issue tracker. Check issues labeled with good first issue if you wish to start coding.

Another approach is to checkout the source code: builtin functions and object methods are often the simplest and easiest way to contribute.

You can also simply run cargo run tests/snippets/whats_left_to_implement.py to assist in finding any unimplemented method.

Testing

To test rustpython, there is a collection of python snippets located in the tests/snippets directory. To run those tests do the following:

$ cd tests
$ pipenv install
$ pipenv run pytest -v

There also are some unit tests, you can run those with cargo:

$ cargo test --all

Using another standard library

As of now the standard library is under construction.

You can play around with other standard libraries for python. For example, the ouroboros library.

To do this, follow this method:

$ cd ~/GIT
$ git clone git@github.com:pybee/ouroboros.git
$ export PYTHONPATH=~/GIT/ouroboros/ouroboros
$ cd RustPython
$ cargo run -- -c 'import statistics'

Compiling to WebAssembly

At this stage RustPython only has preliminary support for web assembly. The instructions here are intended for developers or those wishing to run a toy example.

Setup

To get started, install wasm-pack and npm. (wasm-bindgen should be installed by wasm-pack. if not, install it yourself)

Build

Move into the wasm directory. This directory contains a library crate for interop with python to rust to js and back in wasm/lib, the demo website found at https://rustpython.github.io/demo in wasm/demo, and an example of how to use the crate as a library in one's own JS app in wasm/example.

cd wasm

Go to the demo directory. This is the best way of seeing the changes made to either the library or the JS demo, as the rustpython_wasm module is set to the global JS variable rp on the website.

cd demo

Now, start the webpack development server. It'll compile the crate and then the demo app. This will likely take a long time, both the wasm-pack portion and the webpack portion (from after it says "Your crate has been correctly compiled"), so be patient.

npm run dev

You can now open the webpage on https://localhost:8080 and Python code in either the text box or browser devtools with:

rp.pyEval(
  `
print(js_vars['a'] * 9)
`,
  {
    vars: {
      a: 9
    }
  }
);

Alternatively, you can run npm run build to build the app once, without watching for changes, or npm run dist to build the app in release mode, both for the crate and webpack.

Code style

The code style used is the default rustfmt codestyle. Please format your code accordingly.

Community

Chat with us on gitter.

Code of conduct

Our code of conduct can be found here.

Credit

The initial work was based on windelbouwman/rspython and shinglyu/RustPython

Links

These are some useful links to related projects:

You can’t perform that action at this time.