• Stars
    star
    764
  • Rank 59,449 (Top 2 %)
  • Language
    C
  • License
    MIT License
  • Created almost 11 years ago
  • Updated about 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Pycopy - a minimalist and memory-efficient Python dialect. Good for desktop, cloud, constrained systems, microcontrollers, and just everything.

Build Status Coverage Status

The Pycopy project

Web site | Documentation

Pycopy aims to develop and maintain a minimalist, lightweight, and extensible implementation of Python(-compatible) language. Pycopy to CPython is a similar thing as Scheme to Common Lisp. Pycopy works similarly well in the cloud, on desktop systems, on small embedded systems, and scales all the way down to microcontrollers. The project is developed and maintained by Paul Sokolovsky and is originally based on MicroPython, developed by Damien George, Paul Sokolovsky and contributors. Names "Pycopy" and "MicroPython" are used interchangeably in the project documentation and source code.

WARNING: this project is in beta stage and is subject to changes of the code-base, including project-wide name changes and API changes.

Pycopy implements the entire Python 3.4 syntax (including exceptions, with, yield from, etc., and additionally async/await keywords from Python 3.5). The following core datatypes are provided: str (including basic Unicode support), bytes, bytearray, tuple, list, dict, set, frozenset, array.array, collections.namedtuple, classes and instances. Builtin modules include sys, time, and struct, etc. Select ports have support for _thread module (multithreading). Note that only a subset of Python 3 functionality is implemented for the data types and modules.

Pycopy can execute scripts in textual source form or from precompiled bytecode, in both cases either from an on-device filesystem or "frozen" into the executable.

Pycopy is highly portable, and the main repository includes support for POSIX operating systems (Linux, MacOSX, FreeBSD, etc.), Windows, Android, and a number of bare-metal microcontroller systems (see below). Ports to other systems can be implemented easily. POSIX port (nicknamed "Unix port") is the reference port of Pycopy.

The Pycopy Zen

Just as "big Python", Pycopy has its "Zen". The main principles of Pycopy are simplicity, minimalism, and light-weightedness.

At the same time, Pycopy strives to be a full-stack language and be compatible with wider Python ecosystem. The Pycopy project resolves these seemingly conflicting goals in a well-known and elegant way: by being a multi-level project, and by providing flexible configuration options. Specifically, there's a well-defined lightweight core written in C, defining the "native Pycopy language". Above it, a number of options are provided, implementing additional functionality (oftentimes offering more CPython compatibility). For example, on top of the core, "native Pycopy builtin modules" are provided, defining the native Pycopy API, which provides a subset of CPython's modules functionality, and at the same time, some extensions to it (driven by Pycopy's goal to be efficient). These native Pycopy modules are clearly namespaced, to allow to implement modules fully compatible with CPython API without any changes to the main project.

On top of this primary project, there are separate projects to further extend Pycopy functionality and achieve full-stack ecosystem. For example, there's a pycopy-lib project (see below) to implement a fully compatible CPython standard library for Pycopy.

Finally, on top of that infrastructure, there is an ecosystem of third-party packages, which are managed by the Pycopy users themselves.

The art of working with Pycopy is to understand where a particular feature belongs. Just as with CPython, it's almost never the core project, and almost always users' third party packages.

Contributors' Guidelines further elaborate on some points touched above.

Source tree layout

Major components in this repository:

  • py/ -- the core Python implementation, including compiler, runtime, and core library.
  • mpy-cross/ -- the bytecode (cross)compiler which is used to turn scripts into precompiled bytecode.
  • ports/unix/ -- a version of Pycopy that runs on Unix (which includes Android).
  • ports/windows/ -- a version for Windows.
  • ports/stm32/ -- a version of Pycopy that runs on the PyBoard and similar STM32 boards (using ST's Cube HAL drivers).
  • ports/minimal/ -- a minimal port. Start with this if you want to port the project to another microcontroller.
  • tests/ -- test framework and test scripts.
  • docs/ -- user documentation in Sphinx reStructuredText format. Rendered HTML documentation is available at http://pycopy.readthedocs.io/ .

Additional components:

  • ports/bare-arm/ -- a bare minimum version for ARM MCUs. Used mostly to control code size.
  • ports/teensy/ -- a version that runs on the Teensy 3.1 (preliminary but functional).
  • ports/pic16bit/ -- a version for 16-bit PIC microcontrollers.
  • ports/cc3200/ -- a version that runs on the CC3200 from TI.
  • ports/esp8266/ -- a version that runs on Espressif's ESP8266 SoC.
  • ports/esp32/ -- a version that runs on Espressif's ESP32 SoC.
  • ports/nrf/ -- a version that runs on Nordic's nRF51 and nRF52 MCUs.
  • extmod/ -- additional (non-core) modules implemented in C.
  • tools/ -- various tools, including the pyboard.py module.
  • examples/ -- various example scripts.

The subdirectories above may include READMEs with additional info.

"make" is used to build the components, or "gmake" on BSD-based systems. You will also need bash, gcc, and Python 3.3+ available as the command python3 (if your system only has Python 2.7 then invoke make with the additional option PYTHON=python2).

The cross-compiler, pycopy-cross

Most ports require the Pycopy cross-compiler to be built first. This program, called pycopy-cross, is used to pre-compile Python scripts to .mpy files which can then be included (frozen) into the firmware/executable for a port. To build pycopy-cross use:

$ cd mpy-cross
$ make

The Unix version

The "unix" port requires a standard Unix environment with gcc and GNU make. x86 and x64 architectures are supported (i.e. x86 32- and 64-bit), as well as ARM and MIPS. Making full-featured port to another architecture requires writing some assembly code for the exception handling and garbage collection. Alternatively, fallback implementation based on setjmp/longjmp can be used.

To build (see section below for required dependencies):

$ make -C mpy-cross
$ cd ports/unix
$ make submodules
$ make

Then to give it a try:

$ ./pycopy
>>> list(5 * x + y for x in range(10) for y in [4, 2, 1])

Use CTRL-D (i.e. EOF) to exit the shell. Learn about command-line options (in particular, how to increase heap size which may be needed for larger applications):

$ ./pycopy --help

Run complete testsuite:

$ make test

Unix version comes with a builtin package manager called upip, e.g.:

$ ./pycopy -m upip install pycopy-pystone
$ ./pycopy -m pystone

Browse available modules on PyPI. Standard library modules come from pycopy-lib project.

pycopy executable built following the instructions above is a "production" executable for native Pycopy software. It's also possible to build pycop-dev executable which provides additional reflection, diagnostics, and extensibility capabilities, at the expense of code size and memory usage efficiency. In particular, pycopy-dev is more compatible with software written for CPython. To build the pycopy-dev variant, run make dev.

External dependencies

Building Pycopy ports may require some dependencies installed.

For Unix port, libffi library and pkg-config tool are required. On Debian/Ubuntu/Mint derivative Linux distros, install build-essential (includes toolchain and make), libffi-dev, and pkg-config packages.

Other dependencies can be built together with Pycopy. This may be required to enable extra features or capabilities, and in recent versions, these may be enabled by default. To build these additional dependencies, first fetch git submodules for them:

$ make submodules

This will fetch all the relevant git submodules (sub repositories) that the port needs. Use the same command to get the latest versions of submodules as they are updated from time to time. After that execute:

$ make deplibs

This will build all available dependencies (regardless whether they are used or not). If you intend to build Pycopy with additional options (like cross-compiling), the same set of options should be passed to make deplibs. To actually enable/disable use of dependencies, edit ports/unix/mpconfigport.mk file, which has inline descriptions of the options. For example, to build SSL module (required for upip tool described above, and so enabled by default), MICROPY_PY_USSL should be set to 1.

For some ports, building required dependences is transparent, and happens automatically. But they still need to be fetched with the make submodules command.

Contributing

Pycopy is an open-source project and welcomes contributions which are aligned with its paradigm and work process. To be productive, please be sure to follow the Contributors' Guidelines and the Code Conventions. Note that Pycopy is licenced under the MIT license, and all contributions should follow this license.

Project FAQ

Q: How Pycopy differs from other Python implementations?

A: Pycopy is intended to be a small, minimalist implementation of the "core of the Python language" (in some definition of the "core"). Beyond that, the aim is to be extensible, to be able to support features of other Python implementations. Pycopy is particularly intended to write software (and extensions just mentioned) in Python. This may sounds as oxymoron, but it's a matter of fact that other implementations have too much of their functionality implemented in other languages (e.g., in C for CPython). This is a discouraged approach for Pycopy. Instead, for interfacing with non-Python libraries, it encourages the use of FFI (Foreign Function Interface) and flexible import extensions.

Q: How Pycopy differs from other small Python implementations?

A: Please see previous question for general information on how Pycopy differs from other Python implementations. Regarding small Python implementations specifically, a common issue with them is that they structure and represent themselves as niche, special-purpose systems, and oftentimes implement very bare subset of Python. Pycopy isn't just "Python for microcontrollers" or "Python to embed in other application". First and foremost, Pycopy is a general, and general-purpose, language, suitable for developing any kind of software. Which can be even used on microcontrollers and embedded in other applications (without growing them too much), but it's not limited to that in any way. Pycopy strives to cover as many systems as possible - from clouds down to tiny IoT devices. And project's attention and focus is also shared among them according to the functionality and value particular areas may offer. For example, microcontrollers are neat cute things, but you can do only so much with them, so they represent maybe 20% of the project focus.

Q: Current focus of the project?

A:

  • Code optimizations.
  • Continue to develop inplace, buffer and stream operations allowing to write highly memory effiicient applications.
  • Garbage collection experiments.
  • Reflection features (ultimately allowing to develop optimizing compilers, etc. in Python).
  • More CPython features implemented (configurable).
  • "Development/Testing" version with improved program analysis features.
  • etc.

More Repositories

1

esp-open-sdk

Free and open (as much as possible) integrated SDK for ESP8266/ESP8285 chips
Makefile
1,971
star
2

picotui

Lightweight, pure-Python Text User Interface (TUI) widget toolkit with minimal dependencies. Dedicated to the Pycopy project.
Python
808
star
3

awesome-smarthome

Curated list of awesome SmartHome/Home Automation things (open and leaving users in control)
487
star
4

picoweb

Really minimal web application framework for the Pycopy project (minimalist Python dialect) and its "uasyncio" async framework
Python
474
star
5

ScratchABit

Easily retargetable and hackable interactive disassembler with IDAPython-compatible plugin API
Python
392
star
6

uzlib

Radically unbloated DEFLATE/zlib/gzip compression/decompression library. Can decompress any gzip/zlib data, and offers simplified compressor which produces gzip-compatible output, while requiring much less resources (and providing less compression ratio of course).
C
303
star
7

pycopy-lib

Standard library of the Pycopy project, minimalist and light-weight Python language implementation
Python
247
star
8

awesome-micropython

Curated list of awesome MicroPython resources
175
star
9

awesome-program-analysis

Program Analisys and Transformation survey and links (particular focus on SSA)
153
star
10

blutunode

Autonomous wireless sensor/actuator node using bluetooth modules based on CSR BlueCore chipset. See wiki for more info.
C
149
star
11

foreign-dlopen

Small library allowing to use dlopen() from statically-linked applications (where statically-linked executable vs loaded shared library may use completely different libc's)
C
143
star
12

awesome-linux-android-hacking

List of hints and Q&As to get most of your Linux/Android device
127
star
13

ssabook

Mirror of InriaForge SSABook repository: https://gforge.inria.fr/projects/ssabook/ (was scheduled for retirement at the end of 2020, was still online as of 2021-03, but then gone by 2021-09).
TeX
125
star
14

yaota8266

Yet another OTA solution for ESP8266, this time supporting large (>512KB) firmwares even on 1MB devices (repo is rebased)
C
119
star
15

ScratchABlock

Yet another crippled decompiler project
Python
103
star
16

awesome-python-compilers

Retrospective of Python compilation efforts
62
star
17

utemplate

Micro template engine in Python with low memory usage, designed for Pycopy, a minimalist Python dialect, but also compatible with other Pythons.
Python
60
star
18

graph-llvm-ir

Visualization of LLVM IR
Python
55
star
19

PeripheralTemplateLibrary

Cross-platform, cross-MCU C++ template library for microcontrollers and peripheral devices
C++
54
star
20

android-platform-headers

Collection of platform headers and link libs for all versions of Android. (repo is rebased, see wiki)
C
54
star
21

visited_places

Simple, static, local visited places map (aka travel map) using D3 and D3 Datamaps
HTML
49
star
22

re1.5

re1, the unbloated regexp engine by Russ Cox, elaborated to be useful for real-world applications
C
41
star
23

python-compiler.old

Python2 compiler package ported to Python3. Compiles Python AST (as produced by the "ast" module) to bytecode assembly and code objects.
Python
41
star
24

python-imphook

Simple and clear import hooks for Python - import anything as if it were a Python module
Python
36
star
25

optware-android

Optware setup script for Android devices. Not actively maintained any more. You may want to look at https://github.com/Entware-ng/Entware-ng/wiki/Install-on-Android
Shell
35
star
26

notes-pico

Flask Notes sample application ported to the Pycopy's picoweb web micro-framework
Python
35
star
27

ida-xtensa2

IDAPython plugin for Tensilica Xtensa (as seen in ESP8266), version 2
Python
34
star
28

cortex-uni-startup

Unified startup code and link scripts for Cortex-M microcontrollers
C
32
star
29

pyflate

Pure Python zlib/gzip/bzip2 decompessor/bitstream dumper, plus additional utilities
Python
28
star
30

berkeley-db-1.xx

Berkeley DB 1.85 with patches and fixes applied
C
24
star
31

awesome-implicit-data-structures

Awesome implicit data structures
23
star
32

xtensa-subjects

Xtensa CPU architecture (ESP8266) binaries for ScratchABit interactive disassembler
HTML
22
star
33

esp-open-lwip

Superseded by https://github.com/pfalcon/lwip-esp8266. Was: Untangled build of vendor ESP8266 lwIP library
C
22
star
34

pymsasid3

Pure-Python x86 disassembler, ported to modern Python, with bugfixes
Python
21
star
35

lwip-esp8266

Upstream lwIP with complete history and cleaned up ESP8266 patchset on top
C
18
star
36

idapython

Automatically exported from code.google.com/p/idapython
Python
18
star
37

libperipha

Grand unified collection of headers to access various hardware chips and components
C
18
star
38

pyedit

Simple text editor widget for Python and Pycopy. Further developed in https://github.com/pfalcon/picotui
Python
18
star
39

squirrel-modules

General-purpose Squirrel language project. Includes collection of basic modules (including module loading infrastructure)
C++
17
star
40

pycopy-serial

pySerial-like interface for Pycopy (unix port)
Python
15
star
41

pyastinterp

Python AST interpreter (aka tree-walking interpreter) in Python. Aka meta-circular interpreter.
Python
15
star
42

opkg-static

Static self-contained opkg (the package manager) build for real-world embedded platforms like Android, Kindle, etc.
Shell
14
star
43

awesome-virtual-machines

Awesome Virtual Machines (VMs) and Language Runtimes (awesome from Computer Science perspective)
14
star
44

uorm

Sqlite3-based anti-ORM for Pycopy
Python
14
star
45

ctopy

Hacking on ESR's ctopy the C to Python conversion tool: http://www.catb.org/~esr/ctopy/
Python
14
star
46

papersman

Minimalist electronic documents/papers/publications manager/indexer/categorizer
Python
14
star
47

android-native

Android native (command-line) examples, utils and tools. See Wiki for more info.
C++
13
star
48

uart-bitbang

UART protocol for MCU using GPIO bitbang. Rate-adaptive and requires only clock counter to operate.
C
13
star
49

beap

Beap (bi-parental heap) algorithm reference implementation in Python
Python
13
star
50

esp-docs

Helping Espressif Systems, Inc. achieve 12-year product longevity (mirror of ESP8266, etc. documentation)
12
star
51

pycopy-projs

Various Pycopy-related proofs of concepts and hacks which don't deserve dedicated repos
Python
11
star
52

canterbury-corpus

The Canterbury compression corpus as a git repository
HTML
10
star
53

ullvm_c

Lightweight LLVM C API bindings for Pycopy and other Python implementations
Python
10
star
54

apps2org

Label/tag based application organizer and launcher for Android, fork of https://code.google.com/p/appsorganizer
Java
10
star
55

aes256_128

Code size efficient AES256/AES128 implementation
C
10
star
56

pycopy-jitgen

Generating machine code at runtime (aka JIT) using Pycopy (small Python dialect)
Python
10
star
57

uremi

Proof of concept of developing alike of https://github.com/dddomodossola/remi for Pycopy
Python
9
star
58

ppxml2db

Scripts to import PortfolioPerformance (https://github.com/portfolio-performance/portfolio) XML into a SQLite DB and export back
Python
9
star
59

sphinx_selective_exclude

Sphinx extension (plugin) to make ".only::" directive work like you expect. (Plus some other goodies for selective indexes.) [Unmaintained, may no longer work with latest Sphinx versions.]
Python
9
star
60

esp8266-re-wiki-mirror

Mirror of http://esp8266-re.foogod.com/wiki/
8
star
61

pycopy-filedb

Simple file-based ORM for Pycopy
Python
8
star
62

Chsmartbulb-led-bulb-speaker

Hacking "Chsmartbulb" BT/BLE LED bulb speaker
Python
8
star
63

llvm-codegen-py

(Machine) code generation experiments in Python, roughly centered around LLVM IR
Python
7
star
64

pymapfile

Python module to parse GNU ld/gcc map files
Python
7
star
65

arduino-hosted

Arduino Hosted Python module, allows to rapid-prototype simple Arduino microcontroller applications on desktop computer. Unlike many other Python wrappers, this provides syntax as close as possible to Arduino.
Python
7
star
66

pycopy-btreedb

Very simple ORM for Pycopy's btree module
Python
6
star
67

axtls

Pycopy fork of axTLS
C
6
star
68

pycopy-ffigen

FFI bindings generator for Pycopy
Python
6
star
69

simplejtag

Protocol and firmware to turn any low-cost board into JTAG/SWD adapater to use wiyh OpenOCD, PySWD, etc.
C++
6
star
70

picompile

Pico Compile, factored out "numpile" project, a small JIT compiler for Python with type inference
Python
6
star
71

android-depends

Tool to analyze Android module dependencies. Forked from http://code.google.com/p/rxwen-blog-stuff/source/browse/trunk/tools/
Python
6
star
72

awesome-python-projects

List of Python projects which either do something non-trivial, or are unbloated and lightweight. (See wiki)
6
star
73

parcopy

Implementation (in Python) of algorithm(s) for sequentializing of parallel copy
Python
6
star
74

udownmark

A dead simple parser/renderer for Markdown-like text markup (subset of Markdown). Dedicated to Pycopy, a minimalist Python implementation (https://github.com/pfalcon/micropython).
Python
5
star
75

change-control-manifesto

Change Control Manifesto for principled Open Source projects
5
star
76

esp-sdk-tools

Tools for hacking on Espressif ESP8266/ESP32 SDKs
Shell
4
star
77

py-runinpkg

Run Python scripts inside package directory as normal files, even if they use relative imports
Python
3
star
78

pseudoc-ir

Like LLVM, but simpler
Python
3
star
79

awesome-consumer-iot-hacks

A Collection of Hacks in Consumer IoT Space so that we can use those products (hopefully).
3
star
80

aygshell-win32

Implementation of WinCE AYGSHELL functions for pure Win32 API
C
3
star
81

ARM-CMSIS-BSD

BSD-licensed CMSIS core implementation from ARM, imported from CMSIS-SP-00300-r3p2-00rel1.zip
C
3
star
82

b43-tools

Mirror of git://git.bues.ch/b43-tools.git "Tools for the Broadcom 43xx series WLAN chip"
C
3
star
83

pycopy-uffmpeg

Pycopy bindings for FFmpeg
Python
3
star
84

cppmicroweb

Proof of concept C++ web micro framework for constrained devices inspired by Python microframeworks
C++
3
star
85

pycopy-dlman

Very simple download manager based on wget and Pycopy
Python
2
star
86

uaio_xiaomi_gw

Pycopy uasyncio module for Xiaomi Mi Home Gateway
Python
2
star
87

optware

Mirror of NSLU2 Optware + updates
C
2
star
88

openwrt-tools

Tools to automatically install/configure/manage OpenWRT
Shell
2
star
89

esp-open-headers

Headers for ESP8266 SDK internal functions and structures
C
2
star
90

awesome-stuff

Projects I'd like to record somewhere
2
star
91

dotfiles

Personal dotfiles
Shell
2
star
92

py-simple-serial

Very simple Python serial port module for Linux, roughly compatible with PySerial
Python
2
star
93

pycopy-libusb

libusb bindings for Pycopy
Python
2
star
94

b43-ucode

Mirror of git://git.bues.ch/b43-ucode.git "OpenSource firmware for Broadcom 43xx devices"
Assembly
2
star
95

meta-prefixdistro

OpenEmbedded layer for simlified distro rooted at atbitrary filesystem prefix
1
star
96

python-simple-mixin

Simple mixins for Python without multiple inheritance
Python
1
star
97

git-pynex

Proof of concept reimplementation of subset of git-annex in Python
Python
1
star
98

osmand-gpx-vis

Visualizing GPX tracks recorded by Osmand Android navigation software and other tools
Python
1
star
99

snapdragon410-mmio-gpio

Memory-mapped GPIO access on Snapdragon 410 SoC using MicroPython (and CPython)
Python
1
star
100

fdroidclient

Mirror (+local dev) of client app for F-Droid, FOSS Android package repository.
Java
1
star