# 0. Installing MicroPython library modules

Paul Sokolovsky, the author of most of the micropython library and major
contributor to MicroPython, has forked the MicroPython project. This is the
[pycopy fork](https://github.com/pfalcon/pycopy).

Official firmware may be found on [micropython.org](https://micropython.org/).
Each firmware build has its own library. Some modules in the Pycopy library are
incompatible with the official firmware.

Libraries may be installed by copying files from the appropriate library
repository to the target device. However this requires some attention to detail
where there are dependencies or where modules are organised as Python packages.

Each fork has applications for installing library and user contributed modules
modelled on Python's `pip`. These handle dependencies and build the correct
directory structure on the target.

Note that `pip` and `pip3` cannot be used for MicroPython modules. This is
because the file format is nonstandard. The file format was chosen to enable
the installer to run on targets with minimal resources.

# 1. Contents

 0. [Installing MicroPython library modules](./README.md#0-installing-micropython-library-modules)  
 1. [Contents](./README.md#1-contents)  
 2. [Users of Pycopy firmware](./README.md#2-users-of-pycopy-firmware)  
 3. [Users of official MicroPython](./README.md#3-users-of-official-micropython)  
  3.1 [The installers](./README.md#31-the-installers)  
   3.1.1 [upip_m](./README.md#311-upip_m) upip replacement runs on target hardware  
   3.1.2 [micropip](./README.md#312-micropip) Runs on a PC  
 4. [Overriding built in library modules](./README.md#4-overriding-built-in-library-modules)  

###### [Main README](../README.md)

# 2. Users of Pycopy firmware

The library for the `pycopy` fork may be found [here](https://github.com/pfalcon/micropython-lib).
Library modules located on [PyPi](https://pypi.org/) are correct for the
`pycopy` firmware.

The preferred installation tool is `upip.py` which may be found in the `tools`
directory of MicroPython. It is installed by default on network enabled
hardware such as Pyboard D, ESP8266 and ESP32.

For hardware which is not network enabled, `upip` may be run under the Unix
build of MicroPython to install to an arbitrary directory on a PC. The
resultant directory structure is then copied to the target using a utility such
as [rshell](https://github.com/dhylands/rshell).

Usage of `upip` is documented in the
[official docs](http://docs.micropython.org/en/latest/reference/packages.html).

# 3. Users of official MicroPython

The library at [micropython-lib](https://github.com/micropython/micropython-lib)
is compatible with the official firmware. Unfortunately for users of official
firmware its README is misleading, not least because the advocated `upip`
module may produce an incorrect result. This is because it installs from
[PyPi](https://pypi.org/) and some modules there require the `pycopy` firmware.

Two (unofficial) utilities are provided for users of the official firmware.
Where a library module is to be installed, these will locate a compatible
version. User contributed modules located on PyPi will be handled as normal.
 * `upip_m.py` A modified version of `upip.py`. For network enabled targets.
 * `micropip.py` Installs modules to a PC for copying to the target device.
 This is primarily for non-networked targets and for targets with insufficient
 RAM to run `upip_m.py`. Requires CPython 3.2 or later.

## 3.1 The installers

These have the same invocation details as `upip` and the
[official docs](http://docs.micropython.org/en/latest/reference/packages.html)
should be consulted for usage information.

### 3.1.1 upip_m

The file `upip_m.py` should be copied to the target device. If `upip` is not
available on the target `upip_utarfile.py` must also be copied.

Alternatively and more efficiently these files may be frozen as bytecode. The
method of doing this is [documented here](http://docs.micropython.org/en/latest/reference/packages.html).

Users of the ESP8266 are unlikely to be able to use `upip_m` unless it is
frozen as bytecode. An alternative is to use `micropip.py` to install to a PC
and then to use [rshell](https://github.com/dhylands/rshell) or other utility
to copy the directory structure to the device.

### 3.1.2 micropip

This is a version of `upip_m` which runs under Python 3.2 or above. Library and
user modules are installed to the PC for transfer to the target. It is cross
platform and has been tested under Linux, Windows and OSX.

Help may be accessed with

```
micropip.py --help
```
or

```
python3 -m micropip --help
```
Example invocation line:
```
$ micropip.py install -p ~/rats micropython-uasyncio
```

###### [Contents](./README.md#1-contents)

# 4. Overriding built in library modules

Some firmware builds include library modules as frozen bytecode. On occasion it
may be necessary to replace such a module with an updated or modified
alternative. The most RAM-efficient solution is to rebuild the firmware with
the replacement implemented as frozen bytecode.

For users not wishing to recompile there is an alternative. The module search
order is defined in `sys.path`.

```
>>> import sys
>>> sys.path
['', '/flash', '/flash/lib']
```
The `''` entry indicates that frozen modules will be found before those in the
filesystem. This may be overridden by issuing:
```
>>> import sys
>>> sys.path.append(sys.path.pop(0))
```
This has the following outcome:
```
>>> sys.path
['/flash', '/flash/lib', '']
```
Now modules in the filesystem will be compiled and executed in preference to
those frozen as bytecode.

###### [Contents](./README.md#1-contents)

###### [Main README](../README.md)
