X Tutup
The Wayback Machine - https://web.archive.org/web/20190323061637/https://github.com/RustPython/RustPython
Skip to content
A Python Interpreter written in Rust
Branch: master
Clone or download
Latest commit b7fa08e Mar 22, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
Lib Reduce dependencies of vm and parser crates Jul 18, 2018
derive Convert all &mut VirtualMachine to &VirtualMachine Mar 22, 2019
docs Update builtins.md Feb 3, 2019
parser Rename to Unnamed and Named Mar 20, 2019
py_code_object Migrated the project to the Rust 2018 edition Feb 14, 2019
src Merge branch 'coolreader18/multiline-repl' Mar 22, 2019
tests Use __class__ cell in super Mar 22, 2019
vm Merge pull request #722 from RustPython/joey/unboxed-payload-2 Mar 23, 2019
wasm Merge pull request #722 from RustPython/joey/unboxed-payload-2 Mar 23, 2019
.dockerignore Create dockerfiles for the rustpython binary and wasm demo Jan 3, 2019
.gitignore Add a custom derive for FromArgs Mar 17, 2019
.travis.yml Add selenium test to travis Mar 15, 2019
Cargo.lock Add a custom derive for FromArgs Mar 17, 2019
Cargo.toml Add a custom derive for FromArgs Mar 17, 2019
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 Make logo larger Mar 22, 2019
azure-pipelines.yml Set up CI with Azure Pipelines Feb 16, 2019
code-of-conduct.md Add a code of conduct Mar 7, 2019
demo.py readme and example change Sep 23, 2018
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

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.
X Tutup