Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

imp.load_source replacement #3441

Closed
memsharded opened this issue Aug 30, 2018 · 5 comments
Closed

imp.load_source replacement #3441

memsharded opened this issue Aug 30, 2018 · 5 comments

Comments

@memsharded
Copy link
Member

That function is already deprecated/undocumented.

#3340 tried to replace it with import, but failing in OSX Py3.6.
This has to be revisited and probably fixed for 2.0.

@memsharded memsharded added this to the 2.0 milestone Aug 30, 2018
@danimtb
Copy link
Member

danimtb commented Aug 30, 2018

Could be also replace with:

from importlib.machinery import SourceFileLoader

loaded = SourceFileLoader(filename, conanfile_path).load_module()

When we drop support for python 2

@danimtb
Copy link
Member

danimtb commented Sep 7, 2018

SourceFileLoader().load_module() seems to be deprecated too.
https://docs.python.org/3/library/importlib.html#importlib.abc.Loader.load_module

This could be the solution for python 3:

from importlib.machinery import SourceFileLoader
import types
loader = SourceFileLoader(filename, plugin_path)
loaded = types.ModuleType(loader.name)
loader.exec_module(loaded)

@alalazo
Copy link

alalazo commented Sep 10, 2018

@memsharded Just stumbled on this issue. As I faced exactly the same problem contributing to a different package manager, was wondering if this snippet might be useful to you:

https://github.com/epfl-scitas/spack/blob/af6a3556c4c861148b8e1adc2637685932f4b08a/lib/spack/llnl/util/lang.py#L595-L622

@sztomi
Copy link
Contributor

sztomi commented Oct 19, 2020

I've run into this while trying to parallelize recipe exporting with the following script:

import sys
from pathlib import Path
from concurrent.futures import as_completed, ThreadPoolExecutor

from conans.client.conan_api import ConanAPIV1, _get_conanfile_path, cmd_export


def export_all(path: Path, namespace: str):
  conan = ConanAPIV1()
  conan.create_app()

  user, channel = namespace.split("/")
  sys.path.insert(0, str(Path.cwd().absolute() / "plexconantool"))

  futures = []
  path = Path(path)
  conanfiles = list(sorted(
    _get_conanfile_path(str(subdir.absolute()), cwd=None, py=True)
    for subdir in path.iterdir()
  ))

  with ThreadPoolExecutor(max_workers=12) as pool:
    for cf in conanfiles:
      ftr = pool.submit(
        cmd_export,
        conan.app,
        cf,
        name=None,
        version=None,
        user=user,
        channel=channel,
        keep_source=False,
        graph_lock=None,
        ignore_dirty=False,
      )
      futures.append(ftr)

  for ftr in as_completed(futures):
    ftr.result()


if __name__ == "__main__":
  from argparse import ArgumentParser

  parser = ArgumentParser()
  parser.add_argument("directory", type=Path)
  parser.add_argument("namespace")
  args = parser.parse_args()
  export_all(args.directory, args.namespace)

I got this traceback, which to me appears to be a concurrency bug in imp:

Traceback (most recent call last):                                                                                                                                                        
  File "/home/tamas/src/conan/conans/client/loader.py", line 379, in _parse_conanfile                                                                                                     
    loaded = imp.load_source(module_id, conan_file_path)                                                                                                                                  
  File "/home/tamas/.pyenv/versions/3.6.4/lib/python3.6/imp.py", line 172, in load_source                                                                                                 
    module = _load(spec)                                                                                                                                                                  
  File "<frozen importlib._bootstrap>", line 684, in _load                                                                                                                                
  File "<frozen importlib._bootstrap>", line 670, in _load_unlocked                                                                                                                       
KeyError: '8489a127-1207-11eb-8dd4-b7f7f2789788'                                                                                                                                          
                                                                                                                                                                                          
During handling of the above exception, another exception occurred:                                                                                                                       
                                                                                                                                                                                          
Traceback (most recent call last):                                                                                                                                                        
  File "/home/tamas/src/conan/conans/client/loader.py", line 57, in load_basic_module
    self._generator_manager)
  File "/home/tamas/src/conan/conans/client/loader.py", line 343, in parse_conanfile
    module, filename = _parse_conanfile(conanfile_path)
  File "/home/tamas/src/conan/conans/client/loader.py", line 412, in _parse_conanfile
    '\n'.join(trace[3:])))
conans.errors.ConanException: Unable to load conanfile in /home/tamas/work/conan/packages/opusfile/conanfile.py
  File "/home/tamas/.pyenv/versions/3.6.4/lib/python3.6/imp.py", line 172, in load_source
    module = _load(spec)
  File "<frozen importlib._bootstrap>", line 684, in _load
  File "<frozen importlib._bootstrap>", line 670, in _load_unlocked
KeyError: '8489a127-1207-11eb-8dd4-b7f7f2789788'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "fastexport.py", line 49, in <module>
    export_all(args.directory, args.namespace)
  File "fastexport.py", line 39, in export_all
    ftr.result()
  File "/home/tamas/.pyenv/versions/3.6.4/lib/python3.6/concurrent/futures/_base.py", line 425, in result
    return self.__get_result()
  File "/home/tamas/.pyenv/versions/3.6.4/lib/python3.6/concurrent/futures/_base.py", line 384, in __get_result
    raise self._exception
  File "/home/tamas/.pyenv/versions/3.6.4/lib/python3.6/concurrent/futures/thread.py", line 56, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/tamas/src/conan/conans/client/cmd/export.py", line 68, in cmd_export
    conanfile = loader.load_export(conanfile_path, name, version, user, channel)
  File "/home/tamas/src/conan/conans/client/loader.py", line 155, in load_export
    lock_python_requires)
  File "/home/tamas/src/conan/conans/client/loader.py", line 123, in load_named
    conanfile, _ = self.load_basic_module(conanfile_path, lock_python_requires, user, channel)
  File "/home/tamas/src/conan/conans/client/loader.py", line 89, in load_basic_module
    raise ConanException("Error loading conanfile at '{}': {}".format(conanfile_path, e))
conans.errors.ConanException: Error loading conanfile at '/home/tamas/work/conan/packages/opusfile/conanfile.py': Unable to load conanfile in /home/tamas/work/conan/packages/opusfile/conanfile.py
  File "/home/tamas/.pyenv/versions/3.6.4/lib/python3.6/imp.py", line 172, in load_source
    module = _load(spec)
  File "<frozen importlib._bootstrap>", line 684, in _load
  File "<frozen importlib._bootstrap>", line 670, in _load_unlocked
KeyError: '8489a127-1207-11eb-8dd4-b7f7f2789788'

If I replace the load_source call with the snippet above, I get the following:

Traceback (most recent call last):                                                                                                                                                        
  File "/home/tamas/src/conan/conans/client/hook_manager.py", line 102, in _load_module_from_file                                                                                         
    loaded = __import__(filename)                                                                                                                                                         
ModuleNotFoundError: No module named 'attribute_checker'                                                                                                                                  
                                                                                                                                                                                          
During handling of the above exception, another exception occurred:                                                                                                                       
                                                                                                                                                                                          
Traceback (most recent call last):                                                                                                                                                        
  File "/home/tamas/src/conan/conans/client/hook_manager.py", line 76, in _load_hook
    hook = HookManager._load_module_from_file(hook_path)
  File "/home/tamas/src/conan/conans/client/hook_manager.py", line 126, in _load_module_from_file
    '\n'.join(trace[3:])))
conans.errors.ConanException: Unable to load Hook in /home/tamas/work/conan/conan_home/.conan/hooks/attribute_checker.py
ModuleNotFoundError: No module named 'attribute_checker'


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "fastexport.py", line 49, in <module>
    export_all(args.directory, args.namespace) 
  File "fastexport.py", line 39, in export_all 
    ftr.result()
  File "/home/tamas/.pyenv/versions/3.6.4/lib/python3.6/concurrent/futures/_base.py", line 425, in result
    return self.__get_result()
  File "/home/tamas/.pyenv/versions/3.6.4/lib/python3.6/concurrent/futures/_base.py", line 384, in __get_result
    raise self._exception
  File "/home/tamas/.pyenv/versions/3.6.4/lib/python3.6/concurrent/futures/thread.py", line 56, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/tamas/src/conan/conans/client/cmd/export.py", line 110, in cmd_export
    reference=package_layout.ref)
  File "/home/tamas/src/conan/conans/client/hook_manager.py", line 54, in execute
    self.load_hooks()
  File "/home/tamas/src/conan/conans/client/hook_manager.py", line 69, in load_hooks
    self._load_hook(name)
  File "/home/tamas/src/conan/conans/client/hook_manager.py", line 86, in _load_hook
    raise ConanException("Error loading hook '%s': %s" % (hook_path, str(e)))
conans.errors.ConanException: Error loading hook '/home/tamas/work/conan/conan_home/.conan/hooks/attribute_checker.py': Unable to load Hook in /home/tamas/work/conan/conan_home/.conan/hooks/attribute_checker.py
ModuleNotFoundError: No module named 'attribute_checker'

If I deactivate the attribute_checker hook, the issue disappears. I'm not sure why - __import__ is odd. I think the same snippet could be used for loading the hooks as above.

@memsharded
Copy link
Member Author

Closed by #10127

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

Successfully merging a pull request may close this issue.

5 participants