How to recursively import subpackages in Python?












0















I have an app structure that looks like this:



foo/
bar/
spam.py
baz/
eggs.py


I want to be able to import one package (foo), and also have all modules (spam and eggs) from all subpackages (bar and baz) available in the calling namespace.



Ex:



#!/usr/bin/python

import foo

foo.bar.spam.blah()
foo.baz.eggs.blah()


Currently, I've devised the following __init__.py template, which I have placed in all my package directories:



#!/usr/bin/python

from os.path import dirname, basename, isfile, isdir
import glob

__all__ =

paths = glob.glob(dirname(__file__) + "/*")
for p in paths:
name = basename(p)
if isfile(p) and p.endswith('.py') and not p.endswith('__init__.py'):
__all__.append(name[:-3])
__import__(name[:-3], globals(), locals(), , -1)
elif isdir(p):
if isfile(p + '/__init__.py'):
__all__.append(name)
__import__(name, globals(), locals(), , -1)


This seems to work, but I sort of have no idea what it's doing. I don't understand Pythons namespace nor import system. Is this code safe? I sort of threw it together using a bunch of Google searches. What potential points of failure are involved here?



I intended for this code to instruct a package to import all modules and subpackages within the package root... I sort of just guessed that if a package automatically imports its modules from the package namespace directly, then the modules would be accessible using package.module from the calling namespace. I think this is because the modules are added to the package namespace, which is then added to the calling namespace? Based on this I figured if I put this in all my packages and subpackages, it should ultimately provide access to everything while preserving the hierarchal structure that I have set up? Not sure if the code does precisely and exclusively what I was aiming for, or if it opens other doors that I didn't mean to open.



Could someone tell me:



A.) Is this code safe and/or structurally sound?



B.) what is the standard way of approaching this problem in Python?










share|improve this question


















  • 1





    The usual way to do this is to explicitly import the modules you want, keeping the hierarchical structure. If you want to flatten the structure, the usual way is to explicitly import the nested modules into the top-level __init__.py file. Trying to automatically import nested modules seems like overkill. How many will you have, and how frequently do you add new ones?

    – Ned Batchelder
    Nov 21 '18 at 22:34
















0















I have an app structure that looks like this:



foo/
bar/
spam.py
baz/
eggs.py


I want to be able to import one package (foo), and also have all modules (spam and eggs) from all subpackages (bar and baz) available in the calling namespace.



Ex:



#!/usr/bin/python

import foo

foo.bar.spam.blah()
foo.baz.eggs.blah()


Currently, I've devised the following __init__.py template, which I have placed in all my package directories:



#!/usr/bin/python

from os.path import dirname, basename, isfile, isdir
import glob

__all__ =

paths = glob.glob(dirname(__file__) + "/*")
for p in paths:
name = basename(p)
if isfile(p) and p.endswith('.py') and not p.endswith('__init__.py'):
__all__.append(name[:-3])
__import__(name[:-3], globals(), locals(), , -1)
elif isdir(p):
if isfile(p + '/__init__.py'):
__all__.append(name)
__import__(name, globals(), locals(), , -1)


This seems to work, but I sort of have no idea what it's doing. I don't understand Pythons namespace nor import system. Is this code safe? I sort of threw it together using a bunch of Google searches. What potential points of failure are involved here?



I intended for this code to instruct a package to import all modules and subpackages within the package root... I sort of just guessed that if a package automatically imports its modules from the package namespace directly, then the modules would be accessible using package.module from the calling namespace. I think this is because the modules are added to the package namespace, which is then added to the calling namespace? Based on this I figured if I put this in all my packages and subpackages, it should ultimately provide access to everything while preserving the hierarchal structure that I have set up? Not sure if the code does precisely and exclusively what I was aiming for, or if it opens other doors that I didn't mean to open.



Could someone tell me:



A.) Is this code safe and/or structurally sound?



B.) what is the standard way of approaching this problem in Python?










share|improve this question


















  • 1





    The usual way to do this is to explicitly import the modules you want, keeping the hierarchical structure. If you want to flatten the structure, the usual way is to explicitly import the nested modules into the top-level __init__.py file. Trying to automatically import nested modules seems like overkill. How many will you have, and how frequently do you add new ones?

    – Ned Batchelder
    Nov 21 '18 at 22:34














0












0








0








I have an app structure that looks like this:



foo/
bar/
spam.py
baz/
eggs.py


I want to be able to import one package (foo), and also have all modules (spam and eggs) from all subpackages (bar and baz) available in the calling namespace.



Ex:



#!/usr/bin/python

import foo

foo.bar.spam.blah()
foo.baz.eggs.blah()


Currently, I've devised the following __init__.py template, which I have placed in all my package directories:



#!/usr/bin/python

from os.path import dirname, basename, isfile, isdir
import glob

__all__ =

paths = glob.glob(dirname(__file__) + "/*")
for p in paths:
name = basename(p)
if isfile(p) and p.endswith('.py') and not p.endswith('__init__.py'):
__all__.append(name[:-3])
__import__(name[:-3], globals(), locals(), , -1)
elif isdir(p):
if isfile(p + '/__init__.py'):
__all__.append(name)
__import__(name, globals(), locals(), , -1)


This seems to work, but I sort of have no idea what it's doing. I don't understand Pythons namespace nor import system. Is this code safe? I sort of threw it together using a bunch of Google searches. What potential points of failure are involved here?



I intended for this code to instruct a package to import all modules and subpackages within the package root... I sort of just guessed that if a package automatically imports its modules from the package namespace directly, then the modules would be accessible using package.module from the calling namespace. I think this is because the modules are added to the package namespace, which is then added to the calling namespace? Based on this I figured if I put this in all my packages and subpackages, it should ultimately provide access to everything while preserving the hierarchal structure that I have set up? Not sure if the code does precisely and exclusively what I was aiming for, or if it opens other doors that I didn't mean to open.



Could someone tell me:



A.) Is this code safe and/or structurally sound?



B.) what is the standard way of approaching this problem in Python?










share|improve this question














I have an app structure that looks like this:



foo/
bar/
spam.py
baz/
eggs.py


I want to be able to import one package (foo), and also have all modules (spam and eggs) from all subpackages (bar and baz) available in the calling namespace.



Ex:



#!/usr/bin/python

import foo

foo.bar.spam.blah()
foo.baz.eggs.blah()


Currently, I've devised the following __init__.py template, which I have placed in all my package directories:



#!/usr/bin/python

from os.path import dirname, basename, isfile, isdir
import glob

__all__ =

paths = glob.glob(dirname(__file__) + "/*")
for p in paths:
name = basename(p)
if isfile(p) and p.endswith('.py') and not p.endswith('__init__.py'):
__all__.append(name[:-3])
__import__(name[:-3], globals(), locals(), , -1)
elif isdir(p):
if isfile(p + '/__init__.py'):
__all__.append(name)
__import__(name, globals(), locals(), , -1)


This seems to work, but I sort of have no idea what it's doing. I don't understand Pythons namespace nor import system. Is this code safe? I sort of threw it together using a bunch of Google searches. What potential points of failure are involved here?



I intended for this code to instruct a package to import all modules and subpackages within the package root... I sort of just guessed that if a package automatically imports its modules from the package namespace directly, then the modules would be accessible using package.module from the calling namespace. I think this is because the modules are added to the package namespace, which is then added to the calling namespace? Based on this I figured if I put this in all my packages and subpackages, it should ultimately provide access to everything while preserving the hierarchal structure that I have set up? Not sure if the code does precisely and exclusively what I was aiming for, or if it opens other doors that I didn't mean to open.



Could someone tell me:



A.) Is this code safe and/or structurally sound?



B.) what is the standard way of approaching this problem in Python?







python import namespaces python-import






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 21 '18 at 22:25









NolanNolan

757




757








  • 1





    The usual way to do this is to explicitly import the modules you want, keeping the hierarchical structure. If you want to flatten the structure, the usual way is to explicitly import the nested modules into the top-level __init__.py file. Trying to automatically import nested modules seems like overkill. How many will you have, and how frequently do you add new ones?

    – Ned Batchelder
    Nov 21 '18 at 22:34














  • 1





    The usual way to do this is to explicitly import the modules you want, keeping the hierarchical structure. If you want to flatten the structure, the usual way is to explicitly import the nested modules into the top-level __init__.py file. Trying to automatically import nested modules seems like overkill. How many will you have, and how frequently do you add new ones?

    – Ned Batchelder
    Nov 21 '18 at 22:34








1




1





The usual way to do this is to explicitly import the modules you want, keeping the hierarchical structure. If you want to flatten the structure, the usual way is to explicitly import the nested modules into the top-level __init__.py file. Trying to automatically import nested modules seems like overkill. How many will you have, and how frequently do you add new ones?

– Ned Batchelder
Nov 21 '18 at 22:34





The usual way to do this is to explicitly import the modules you want, keeping the hierarchical structure. If you want to flatten the structure, the usual way is to explicitly import the nested modules into the top-level __init__.py file. Trying to automatically import nested modules seems like overkill. How many will you have, and how frequently do you add new ones?

– Ned Batchelder
Nov 21 '18 at 22:34












0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53421295%2fhow-to-recursively-import-subpackages-in-python%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53421295%2fhow-to-recursively-import-subpackages-in-python%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

MongoDB - Not Authorized To Execute Command

How to fix TextFormField cause rebuild widget in Flutter

in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith