Mpy modules cannot be imported (sys.path missing '') when running file outside of cwd
Found on unix port - protostuffer is a single .py file in the modules folder, built in at compile time
./micropython
MicroPython v1.9.3-7-g46e9ef6-dirty on 2017-12-21; linux version
Use Ctrl-D to exit, Ctrl-E for paste mode
>>> import protostuffer
>>>
./micropython ../../tests/protostuffer-tests/header.py
Traceback (most recent call last):
File "../../tests/protostuffer-tests/header.py", line 1, in <module>
ImportError: no module named 'protostuffer'
To fix
./micropython -i ../../tests/protostuffer-tests/header.py
Traceback (most recent call last):
File "../../tests/protostuffer-tests/header.py", line 1, in <module>
ImportError: no module named 'protostuffer'
MicroPython v1.9.3-7-g46e9ef6-dirty on 2017-12-21; linux version
Use Ctrl-D to exit, Ctrl-E for paste mode
>>> import protostuffer
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: no module named 'protostuffer'
>>> import sys
>>> sys.path.append('')
>>> import protostuffer
>>>
unix: sys.path affects loading of frozen modules
Example:
- Add a frozen module to unix/windows port.
- At the repl:
import mymodule # works
- create demo.py containing
import mymodule
Run
$ ./micropython ~/mpy/demo.py
Traceback (most recent call last):
File "/home/jimmo/mpy/demo.py", line 5, in <module>
ImportError: no module named 'mymodule'
The underlying issue here is that the unix port, when running normally has sys.path=["", "~/.micropython/lib:/usr/lib/micropython"], and when running with a path to /path/to/demo.py has sys.path=["/path/to", "~/.micropython/lib:/usr/lib/micropython"]
When import mymodule is executed, it's trying to load mp_frozen_stat("/path/to/mymodule"), but the frozen module is just named "mymodule".
I'm not sure if the fix here is to improve the frozen module matching (i.e. assume that all frozen modules are in all sys.paths), or to always have "" as the final entry in sys.path? Or something else? Need to consider how thiss interact with the behavior where filesystem modules override frozen modules of the same name.
This came from the forum: https://forum.micropython.org/viewtopic.php?f=12&t=8995&p=50840#p50840