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

Unable to load resources for modules #203

Closed
jaraco opened this issue Nov 7, 2020 · 6 comments · Fixed by #258
Closed

Unable to load resources for modules #203

jaraco opened this issue Nov 7, 2020 · 6 comments · Fixed by #258
Assignees

Comments

@jaraco
Copy link
Member

jaraco commented Nov 7, 2020

In #60, I encountered an issue where importlib resources was unable to supply an interface for modules that wish to load neighboring resources. I've encountered another use-case where it's not straightforward to replace the pkg_resources usage with importlib.resources.

Again, in this case, because the test module isn't in a package, importlib resources doesn't support it, but pkg_resources does. The current workarounds include:

  • make the tests directory a proper package. However, doing this also causes that package to get discovered as a package.
  • assume the files are on a local file system and access __file__ to infer the location of nearby resources.

In my opinion, if 'importlib' supports importing non-package modules, 'importlib resources' should support loading resources pertinent to those modules.

@FFY00
Copy link
Member

FFY00 commented May 13, 2021

Shouldn't os.path.abspath(os.path.join(__file__, '..', 'empty.docx')) work there? This is the most used solution, I have done this myself numerous times.

Another option would be __loader__.get_data('empty.docx'), which would work most times.

@FFY00
Copy link
Member

FFY00 commented Oct 22, 2021

Would it be possible to make files accept a ModuleSpec? Making it possible to do files(__spec__) to get the resources for the current module.

Currently, the best option to plug the current module into to files IMO is files(sys.modules[__name__]).

@FFY00
Copy link
Member

FFY00 commented Oct 23, 2021

@jaraco I would like to hear your feedback on this proposal when you have time. Personally, I have mixed feelings, but can't come up with anything better.

Actually, I would really like for Python to add a __module__ global, but that is likely not gonna happen. I will have to keep using sys.modules[__name__] 🙃

@jaraco
Copy link
Member Author

jaraco commented Jul 22, 2022

Today I noticed the comments and they were minimized, though I'm unsure why. I've unhidden the comments as they seem valid and in good faith.

@jaraco
Copy link
Member Author

jaraco commented Jul 22, 2022

Shouldn't os.path.abspath(os.path.join(__file__, '..', 'empty.docx')) work there? This is the most used solution, I have done this myself numerous times.

Sure, if you wish to assume that all resources are on the file system and if you're willing to force the user to encode the structure of their modules into their implementation, then that's fine. However, it's these use-cases that importlib resources aims to abstract away and that pkg_resources already provides a simple, elegant solution.

Another option would be __loader__.get_data('empty.docx'), which would work most times.

Yes, but again, I'd rather provide a uniform solution for users instead of a set of instructions that boils down to: "use importlib resources when you have resources in packages, but use some other technique when you have resources alongside modules."

Would it be possible to make files accept a ModuleSpec? Making it possible to do files(__spec__) to get the resources for the current module.

Yes, I was thinking something like that. Especially if files(__spec__) provides a consistent experience whether the module is top-level or a module in a package or is itself a package.

@FFY00
Copy link
Member

FFY00 commented Jul 22, 2022

Yeah, I marked them as "outdated" as I looked into the issue and realized the proposals did not make much sense.

@jaraco jaraco self-assigned this Jul 22, 2022
jaraco added a commit that referenced this issue Jul 22, 2022
…tion of resources from adjacent modules, even those not found in a package. Fixes #203.
jaraco added a commit that referenced this issue Jul 22, 2022
jaraco added a commit that referenced this issue Oct 5, 2022
…tion of resources from adjacent modules, even those not found in a package. Fixes #203.
jaraco added a commit that referenced this issue Oct 5, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants