2013-07-31 74 views
0

我想構建一個模擬from package_name import *的函數。雖然this question通過修改globals()來回答如何做到這一點。 globals(),但是,是本地的功能是在所定義的模塊。在函數內的Python模塊中導入所有內容

例如,假設我定義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) 

然後在second_package.py

import first_package 

first_package.load_contents('third_package.py') 
運行下面的代碼

什麼都不會發生。我怎樣才能解決這個問題?

回答

1

訣竅是使用sys._getframe上調用堆棧1步驟,然後檢索調用者的全局變量。精確的代碼,

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) 

請注意,此代碼只能與CPython的工作,因爲sys._getframe是實現特定的功能。

1

您可以在內創建一個字典變量first_package.py即交叉模塊變量。請參考鏈接here瞭解如何定義交叉模塊變量。是指由JFSebastian提供的響應

這是一件好事,採用一個簡單的方式,不能玩弄蟒蛇的內部機制 - 因爲有可能是在一個複雜的應用程序,活動的副作用

0

您可以隨時將您的調用者全局字典傳遞給該函數,然後添加到該函數中。

相關問題