Skip to content

unix: sys.path affects loading of frozen modules #6419

Closed

Description

@jimmo

Example:

  1. Add a frozen module to unix/windows port.
  2. At the repl:
import mymodule # works
  1. 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

Activity

  1. RobertoRoos commented on Sep 8, 2020

    @RobertoRoos

    Is there a quick fix to simply append "" to sys.path whenever micropython starts? Is there an accessible way to run start-up code?

    (Hitman1O1 from the forum here)

  2. dpgeorge commented on Sep 8, 2020

    @dpgeorge
    Member

    This is kind of a feature, in that the location of "" in sys.path allows you to control the order of searching in frozen code. But I think it needs to be improved.

    See existing issues: #1804, #2322, #3509

  3. RobertoRoos commented on Sep 8, 2020

    @RobertoRoos

    For other people who would like a quick and dirty fix, I 'fixed' the feature by modifying the default sys.path value.
    In ports/unix/mponfigport.h I added the following line:

    #define MICROPY_PY_SYS_PATH_DEFAULT ":~/.micropython/lib:/usr/lib/micropython"

    And in ports/windows/mpconfigport.h I modified the line to look like:

    #define MICROPY_PY_SYS_PATH_DEFAULT ";~/.micropython/lib"

    Now "" is always in sys.path. It's actually in there twice when starting the REPL, but I haven't found a consequence of this yet.

  4. chrisdecker1201 commented on Nov 26, 2021

    @chrisdecker1201
    Contributor

    I had/have the same issue.

    Quick workaround for me was to just append "" to the sys.path

    from sys import path
    path.append("")
    
    # start with the module import here
    import mymodule
  5. dpgeorge commented on Dec 17, 2021

    @dpgeorge
    Member

    Fixed by e0bf461

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions