2015-11-02 64 views
0

我有以下標準導入過程:如何從函數內執行`import *`?

from ROOT import * 

的因爲ROOT處理命令行選項和參數,類似的方式,以避免搞砸了腳本的命令行解析需要如下:

argv_tmp = sys.argv 
sys.argv = [] 
from ROOT import * 
sys.argv = argv_tmp 

我需要在許多腳本中執行此操作。這個操作可能會改變,也可能是更好的方法,所以我想將這個過程集中在一個導入模塊提供的單個函數中,以便將來更改過程。

def import_ROOT(): 
    # magic 

import os 
import sys 
import_ROOT() 
import docopt 

我怎樣才能導入根模塊從功能中,使得腳本的操作的結果是一樣的上述from ROOT import *程序?

+1

你不應該需要做那些東西。這聽起來像你在ROOT.py中沒有正確的'main()'函數和'if __name__ =='__main __':'main()'。 –

+0

@ PM2Ring感謝您的評論。 'ROOT.py'是一個模塊,而不是腳本。它不具有'main'功能。另外,它是[ROOT](https://root.cern.ch/)框架的Python綁定基礎結構,所以它不是我可以輕易更改的東西。我需要關注對腳本的更改,而不是模塊。 – d3pd

+0

啊,好的。如果可以的話,儘量避免[from import *](http://stackoverflow.com/questions/2386714/why-is-import-bad)。 –

回答

2

如何局部變量來實現。由於在Python你不能做到這一點。由於您不知道可能導入的所有變量,因此您無法將它們聲明爲全局變量。

至於爲什麼你不能在一個函數中導​​入未知的locals。這是因爲在編譯時python會建立所有可能存在的不同可能的本地(任何直接分配給它的東西,並且沒有被聲明爲全局的或非本地的)。這些當地人的空間由與每次函數調用相關的數組組成。然後所有的本地人都會通過它們在數組中的索引而不是他們的名字來引用。因此,解釋者無法爲未知的當地人創造額外的空間,也不知道如何在運行時參考他們。

0

我相信有已經一個類似的問題在這裏:

Python: how to make global imports from a function

例如:

def example_function(): 
    global module 
    import module 
+0

感謝您的建議。我認爲這種方法等同於'將ROOT引入ROOT',*不引用ROOT * * *。 – d3pd

0

這可能會缺少各種極端情況,但它是一個開始:

def import_ROOT(): 
    import ROOT 
    globals().update(ROOT.__dict__) 

強制性條款:如果要導入*,你可能就錯了。但我想可能會出現這樣的情況,import *是較小​​的惡意。