Skip to content

Python module support is not yet implemented #14

Description

@pfalcon

Not trying to cause any hassle, but instead to have fact recorded, and possible to get some comments regarding planning and issues related to implementation.

So, "import" statement (well, import() builtin func) is currently not implemented (just dumps its args), and mp_module_new() has following comment:

// temporary way of making C modules
// hack: use class to mimic a module

I understand that full-fledged modules support is probably not top-priority for MCU port - being able to create C modules and using just single main Python app already allows to do a lot of things. But sooner or later it will be needed - that's what we all expect from Python - being easily to reuse 3rd-party modules, right? (Actually #7 already touched on that.) And "unix" port is pretty orphaned without it.

So, any planning/ETA when this might be implemented? Any blockers on the road? For example, I don't know if all needed things on core side are there, but I may imagine there're many "boring" questions like modules search paths, then differences between search paths/mehods for ports (MCU vs unix), support for precompiled bytecode files, etc. etc.

Activity

  1. dpgeorge commented on Dec 30, 2013

    @dpgeorge
    Member

    Yep, import is not yet functional :) This was pretty much the next thing on my list to get working, since I know it's very important, and I can't really call it Micro Python if it ain't got import/modules.

    There are no road blocks, I just need time to implement it. The compiler emits correct import code, all the framework is there to run "import" when needed, and module-level variables (dictionary) is already being used for the main script.

  2. Neon22 commented on Dec 31, 2013

    @Neon22
    Contributor

    I'm hoping to help with this issue by doing the following. Can you guys validate if this is a good idea - or if the import module for micropython will take care of it ?

    It makes a minmal set of python code by copying and stripping unused functions out of imported modules.
    First - it processes the tree of imports from all python files.
    Second - it copies these files to a new subdirectory, renames them and their respective imports so the new files are loaded instead of the original modules.
    Third - it removes all unused code from these files.
    The end result is a minimal python setup which will have the smallest memory footprint.

    It is one way to solve the problem, but the import preprocessor could also strip out unused functions (I think).

    Is this a useful thing to do ?
    Its here: https://github.com/Neon22/python-flavin

  3. pfalcon commented on Dec 31, 2013

    @pfalcon
    ContributorAuthor

    @dpgeorge: Good plan, thanks!

  4. pfalcon commented on Dec 31, 2013

    @pfalcon
    ContributorAuthor

    @Neon22: Regardless of how uPy module system will work, I guess your tool is useful. I hope you tried to search prior art to avoid reinventing a wheel (but I personally never heard of such tool for Python). Also I hope you keep in mind that in general case it's not possible to do what you want in a dynamic language ;-). Because for example you can do obj.getattr("do_" + method)(). So, I hope you'll balance automation and heuristics vs user configurability. Java's ProGuard as used e.g. by Android can be example of production-quality tool which does this stuff. All in all, this is worth a separate space to discuss (yeah, we'll need forum in some time ;-). Hope someone indeed helps Damien with that to let him do hacking, which noone else can do ;-).)

  5. dpgeorge commented on Jan 1, 2014

    @dpgeorge
    Member

    @Neon22: the upython code will not do any of this. It will act as normal CPython does and read in the right Python script, compile/run it, and assign global names as appropriate. Any minification, as you suggest, would need to be done by a preprocessor. So your tool would be useful, but I wouldn't classifiy it as a priority.

  6. dpgeorge commented on Jan 3, 2014

    @dpgeorge
    Member

    Basic import is now working. Still some things to fix up so I'll keep this issue open.

  7. pfalcon commented on Jan 13, 2014

    @pfalcon
    ContributorAuthor

    Basic import indeed works, so let's close this and open more feature-detailed tickets as needed.

  8. added a commit that references this issue on Dec 17, 2016
    781633c
  9. added a commit that references this issue on Jan 22, 2017
  10. added a commit that references this issue on Jul 28, 2020
  11. added a commit that references this issue on Aug 20, 2020
  12. added a commit that references this issue on Feb 14, 2021
  13. added a commit that references this issue on Jul 1, 2021
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