0

I would like to construct a function that emulates from package_name import *. While this question answers how one might do so by modifying globals(). globals(), however, is local to the module the function is defined in.

For example, suppose I define the following function in first_package.py,

import imp
def load_contents(path):
 """Load everything from another package"""
 module = imp.load_source('', path)
 for k in dir(module):
 if not '__' in k: # ignore __xxx__ private variables
 globals()[k] = getattr(module, k)

Then run the following code in second_package.py

import first_package
first_package.load_contents('third_package.py')

Nothing will happen. How can I fix this?

asked Jul 31, 2013 at 5:05

3 Answers 3

1

The trick is to use sys._getframe to go up the call stack 1 step, then retrieve the globals of the caller. The precise code is,

def load_contents(path):
 """Load contents of another configuration file"""
 module = imp.load_source('', path)
 glob = sys._getframe(1).f_globals # globals of calling module
 for k in dir(module):
 if not '__' in k: # ignore __xxx__ private variables
 glob[k] = getattr(module, k)

Note that this code will only work with CPython, as sys._getframe is an implementation-specific function.

answered Jul 31, 2013 at 5:12
Sign up to request clarification or add additional context in comments.

Comments

1

You can create a dictionary variable within first_package.py that is a cross module variables. Please refer to the link here on how to go about defining a cross module variable. Refer to the response provided by J.F.Sebastian

It is always good to adopt a simple approach that does not play around with python internal mechanisms - since there may be side-effects of such activities in a complex application

answered Jul 31, 2013 at 5:21

Comments

0

You could always pass your callers globals dictionary in to the function and then add to it.

answered Jul 31, 2013 at 6:01

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.