2016-07-07 77 views
1

我正在嘗試修改模塊的導入名稱,具體取決於我是否在筆記本中。 我想是這樣筆記本中的條件導入python

api.py

is_notebook = False 
if is_notebook: 
    from tqdm import tnrange as trange 
    from tqdm import tqdm_notebook as tqdm 
else: 
    from tqdm import trange 
    from tqdm import tqdm 

,並在筆記本電腦的電池,我會做:

import api 
api.is_notebook = True 

但它似乎並沒有工作。 我該如何做到這一點?

+0

什麼是錯誤你得到了什麼? –

+0

我沒有任何錯誤,但不會修改導入。 – Orelus

+0

1.你嘗試過「嘗試 - 除外」嗎? 2.你有沒有爲導入調試代碼;嘗試通過添加一個打印語句在try和除了塊? –

回答

0

,我認爲我們可以通過中間文件abc.py這樣達到相同的:的abc.py

is_notebook = False 
if is_notebook: 
    from tqdm import tnrange as trange 
    from tqdm import tqdm_notebook as tqdm 
else: 
    from tqdm import trange 
    from tqdm import tqdm 

然後在產品代碼

內容嘗試這樣的:

from abc import trange 
from abc import tqdm 

您將得到trange和tqdm的正確代碼。

0

api.py

def imports(is_notebook): 
    if is_notebook: 
     from tqdm import tnrange as trange 
     from tqdm import tqdm_notebook as tqdm 
    else: 
     from tqdm import trange 
     from tqdm import tqdm 

導入api.py調用這個函數後:

api.imports(True) 
0

這是一個有點哈克解決方案依託的方式Python模塊導入的工作原理,以及它可能會很容易中斷。我很抱歉。

在您的代碼中,只有在導入模塊api後纔將筆記本設置爲True,因此它不起作用。但是,在模塊加載之前,您也無法訪問筆記本變量,因爲您沒有參考。 解決方案是製作第三個模塊,我們稱它爲「notebook.py」,它只是一個空文本文件。

在您的主體中,您首先調用「導入筆記本」來創建筆記本模塊的全局實例。然後將該模塊中的筆記本屬性設置爲true或false。

接下來,導入api。從api,也進口筆記本電腦模塊。 Python很聰明,只是給你一個對同一個對象的引用,而不是再次加載模塊。現在你可以使用這個模塊的「notebook」屬性來檢查要加載的子模塊。

最後COAD看起來像這樣:

notebook.py:

#no actual code here 

main.py

import notebook 
notebook.notebook=True 
import api 

api.py

import notebook 
if notebook.notebook: 
    from tqdm import tnrange as trange 
    from tqdm import tqdm_notebook as tqdm 
else: 
    from tqdm import trange 
    from tqdm import tqdm 
相關問題