2017-09-22 40 views
0

我使用了很多Jupyter筆記本來設計系統。我發現自己做同樣的事情來爲每個筆記本開始設置我的環境,所以我想我會做一個功能,爲我做所有這些。它應該將模塊列表導入到所需的名稱空間中。例如,假設該功能存在於:my_package.setup_workspace:在一個函數中導​​入多個python模塊,以輕鬆設置熟悉的環境

def imports(): 
    import numpy as np 

然後我想能夠建立我的一個新的jupyter筆記本工作區:

import my_package 
my_package.setup_workspace 
np.array(["I wish this could work!"]) 

但是,當我這樣做, ,python報告它找不到np,因此imports()函數無法將numpy正確導入新的jupyter工作區。

回答

1

當你在一個函數中進行導入時,你可以在該函數的local名稱空間中導入東西,而不是在模塊global之一。除非你聲明變量是全局的,但是它們需要已經在外部範圍內退出。這允許您跨功能重複使用變量名稱,而不會「污染」外部範圍。

你的前進幾個方面:

首先自給的方式看到this Twitter的線程和this的解決方案,來定義自己的魔法。然後,您可以在筆記本中執行%imports以通過一堆導入來替換當前單元格。優點是你可以傳遞選項,但它只能在IPython中使用。

其次,只需刪除該功能,並在my_package.py的頂層執行所有設置,然後執行from my_package import *import *在Python世界中被人們所詬病,但如果它只是爲了你,你應該是安全的。

第三,看一下IPython中的%run -i可以做什麼,它很冒險,但應該可以工作,因爲它可以在當前命名空間中執行和外部腳本。

有一些其他瘋狂的方式可以調查一旦你想深入瞭解python的工作方式:例如,你可以實際手動提取setup_workspace__code__對象;修改它並重新執行它以不創建本地範圍,但that's可能不是您要查找的內容。儘管這是可能的,但是可能無法在Python版本中移植。

+0

這很有幫助。我有點驚訝,沒有標準的選擇,但我想這是因爲設計者認爲最好總是明確命名空間,而不要讓另一個導入的文件污染全局命名空間。我想我會使用import *方法。這樣我也可以在my_package.py中運行自定義設置代碼,進一步設置我的工作空間(設置numpy和pandas自定義選項)並確保用戶在正確的虛擬環境中運行。謝謝! –