Skip to content

Deprecate imp.find_module()/load_module() #59002

Closed

Description

@brettcannon
BPO 14797
Nosy @brettcannon, @theller, @terryjreedy, @ezio-melotti, @merwok, @florentx, @ericsnowcurrently
Dependencies
  • bpo-17314: Stop using imp.find_module() in multiprocessing
  • bpo-18055: Stop using imp in IDLE
  • bpo-18157: remove usage of imp.load_module() from pydoc
  • bpo-18158: Delete test_importhooks
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = 'https://github.com/brettcannon'
    closed_at = <Date 2013-06-11.21:13:25.877>
    created_at = <Date 2012-05-13.16:32:08.442>
    labels = ['type-feature', 'library']
    title = 'Deprecate imp.find_module()/load_module()'
    updated_at = <Date 2013-06-11.21:13:25.876>
    user = 'https://github.com/brettcannon'

    bugs.python.org fields:

    activity = <Date 2013-06-11.21:13:25.876>
    actor = 'brett.cannon'
    assignee = 'brett.cannon'
    closed = True
    closed_date = <Date 2013-06-11.21:13:25.877>
    closer = 'brett.cannon'
    components = ['Library (Lib)']
    creation = <Date 2012-05-13.16:32:08.442>
    creator = 'brett.cannon'
    dependencies = ['17314', '18055', '18157', '18158']
    files = []
    hgrepos = []
    issue_num = 14797
    keywords = []
    message_count = 8.0
    messages = ['160522', '160525', '160526', '183180', '183181', '190763', '190764', '190813']
    nosy_count = 8.0
    nosy_names = ['brett.cannon', 'theller', 'terry.reedy', 'ezio.melotti', 'eric.araujo', 'Arfrever', 'flox', 'eric.snow']
    pr_nums = []
    priority = 'low'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = 'enhancement'
    url = 'https://bugs.python.org/issue14797'
    versions = ['Python 3.4']

    Activity

    1. brettcannon commented on May 13, 2012

      @brettcannon
      MemberAuthor

      With importlib.find_loader() now implemented, imp.find_module() (and its companion, imp.load_module()) can go away and stop inflicting their bad API upon the world.

      The trick, though, is fixing code that uses the API. That means pkgutil, multiprocessing.forking, modulefinder, and idlelib.EditorWindow all need to be patched to stop using imp.find_module()/load_module().

    2. added
      stdlibStandard Library Python modules in the Lib/ directory
      type-featureA feature request or enhancement
      on May 13, 2012
    3. brettcannon commented on May 13, 2012

      @brettcannon
      MemberAuthor

      http://hg.python.org/lookup/59870239813c documents imp.find_module/load_module as deprecated w/o actually raising the deprecation. The code works fine, but the API is just crap. So in the name of ease of transition (and my own personal sanity), I didn't go full-blown deprecation. The remaining code that uses imp.find_module() in the stdlib uses the API's unique properties (e.g. executing under a different name in multiprocessing) or directly exposes the API (e.g. pkgutil and modulefinder). As for idle, I don't run the tool so I don't feel like editing the code and getting it wrong.

    4. brettcannon commented on May 13, 2012

      @brettcannon
      MemberAuthor

      BTW, I'm leaving this issue open in case someone wants to take a stab and removing the uses of imp.find_module()/load_module() from the stdlb.

    5. brettcannon commented on Feb 27, 2013

      @brettcannon
      MemberAuthor

      Assuming issue bpo-17314 gets fixed, that leaves the following uses of imp.find_module():

      Lib/idlelib/EditorWindow.py
      39: """Version of imp.find_module() that handles hierarchical module names"""
      45: (file, filename, descr) = imp.find_module(tgt, path)

      Lib/modulefinder.py
      482: return imp.find_module(name, path)

      Lib/pkgutil.py
      229: file, filename, etc = imp.find_module(subname, path)

      Lib/test/test_imp.py
      59: with imp.find_module('module_' + mod, self.test_path)[0] as fd:
      64: imp.find_module('badsyntax_pep3120', path)
      68: fp, filename, info = imp.find_module('module_' + mod,
      77: fp, filename, info = imp.find_module("tokenize")
      91: file, filename, info = imp.find_module(temp_mod_name)
      147: file, filename, info = imp.find_module(temp_mod_name)
      187: imp.find_module, "badsyntax_pep3120", [path])
      201: x = imp.find_module("os")
      213: x = imp.find_module(example)
      223: fileobj, pathname, description = imp.find_module(m)

      Lib/test/test_import.py
      128: imp.find_module, TESTFN, ["."])

      Lib/test/test_importhooks.py
      118: file, filename, stuff = imp.find_module(subname, path)

    6. brettcannon commented on Feb 27, 2013

      @brettcannon
      MemberAuthor

      The remaining uses of imp.load_module() after issue bpo-17314 (which will probably all disappear as uses of imp.find_module() is removed):

      Lib/idlelib/EditorWindow.py
      48: module = imp.load_module(tgt, file, filename, descr)

      Lib/pkgutil.py
      291: mod = imp.load_module(fullname, self.file, self.filename, self.etc)

      Lib/pydoc.py
      47:# - imp.load_module() cannot be prevented from clobbering existing
      277: module = imp.load_module(name, file, path, (ext, 'r', kind))

      Lib/test/test_imp.py
      155: mod = imp.load_module(temp_mod_name, file, filename, info)
      203: new_os = imp.load_module("os", *x)
      217: mod = imp.load_module(example, *x)

      Lib/test/test_importhooks.py
      132: mod = imp.load_module(fullname, self.file, self.filename, self.stuff)

    7. self-assigned this
      on Feb 27, 2013
    8. brettcannon commented on Jun 7, 2013

      @brettcannon
      MemberAuthor

      Current status (with test_imp stripped out):

      ack "imp\.(find|load)_module" Lib
      Lib/modulefinder.py
      482: return imp.find_module(name, path)

      Lib/pkgutil.py
      189: file, filename, etc = imp.find_module(subname, path)
      251: mod = imp.load_module(fullname, self.file, self.filename, self.etc)

      Lib/pydoc.py
      47:# - imp.load_module() cannot be prevented from clobbering existing
      280: module = imp.load_module(name, file, path, (ext, 'r', kind))

      Lib/test/test_importhooks.py
      118: file, filename, stuff = imp.find_module(subname, path)
      132: mod = imp.load_module(fullname, self.file, self.filename, self.stuff)

    9. brettcannon commented on Jun 7, 2013

      @brettcannon
      MemberAuthor

      The modulefinder usage is directly exposed in its API as the return value of a find_module method, which makes removal a pain. Adding Thomas Heller to see what he has to say.

      The pkgutil usage is in classes that have been deprecated, so don't care.

      The rest should be workable and I will file separate bugs.

    10. theller commented on Jun 8, 2013

      @theller

      The modulefinder usage is directly exposed in its API as the return
      value of a find_module method, which makes removal a pain. Adding
      Thomas Heller to see what he has to say.

      Some months ago, I have started to implement a brand-new modulefinder,
      which is based on importlib. It has a different API, but the (barely)
      documented API functions remain the same or could be made compatible.
      The advantage against the current modulefinder is that it finds modules
      in zipfiles, for example in zipped eggs.

      IMO it is not yet ready for inclusion into Python 3.4, but given the
      plans for the first alpha release in August I will hopefully find
      time to work on it a little bit more.

      If someone wants to read the code, or try it out:

      Modulefinder:
      http://code.google.com/p/ctypes-stuff/source/browse/trunk/mf/mf4.py

      Test:
      http://code.google.com/p/ctypes-stuff/source/browse/trunk/mf/maketest.py

      Thomas

    11. transferred this issue fromon Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    Labels

    stdlibStandard Library Python modules in the Lib/ directorytype-featureA feature request or enhancement

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions