2011-06-17 42 views
2

我正在嘗試用MPI向其他python進程廣播一個模塊。當然,一個模塊本身不是pickleable,但__dict__是。目前,我正在酸洗__dict__並在接收過程中創建一個新模塊。這與一些簡單的自定義模塊完美結合。但是,當我嘗試用NumPy來做到這一點時,有一件事情我不能輕鬆泡製:ufunc幫助如何泡菜ufunc?

我讀過這個線程表明酸洗ufunc__name____module__,但似乎他們依靠具有numpy的全面建成和目前他們重建它。我需要避免在接收過程中全部使用import聲明,所以我很好奇所提到的getattr(numpy,name)聲明是否適用於尚未包含ufunc的模塊。

另外,我沒有看到NumPy的文檔中的一個ufunc屬性__module__http://docs.scipy.org/doc/numpy/reference/ufuncs.html

任何幫助或建議,請?

編輯:對不起,忘了包括上面提到的線程。 http://mail.scipy.org/pipermail/numpy-discussion/2007-January/025778.html

回答

3

在Python中醃一個函數只能序列化它的名字和它來自的模塊。它不會通過電纜傳輸代碼,因此當取消打印時,您需要使用與酸洗時相同的庫。取消打開時,Python只需導入相關模塊,然後通過getattr獲取項目。 (這不限於Numpy,但一般適用於酸洗。)

Ufuncs不會乾淨地醃製,這是一個疣。您的選項主要是醃製ufunc的__name__(也可能是__class__),並稍後手動重構它們。 (它們實際上並不是Python函數,並且沒有__module__屬性。)

+0

接收進程並不實際導入任何內容,因爲我只是通過MPI中的'bcast'函數醃製模塊的__dict__'(' mpi4py')。然後我創建一個空白模塊,將'__dict__'插入。我將使用我的調試解釋器來運行它,看看它是否實際上導入了像你所建議的任何東西。我試圖做的目的是試圖阻止接收進程在導入模塊時不得不訪問文件系統。 – Tim

+2

這些進口發生在'pickle.load'內,這是mpi4py調用的 - 這是你無法控制的。 (如果你有興趣,你可以看看酸洗的工作原理:http://hg.python.org/cpython/file/tip/Lib/pickle.py#l1067或者只是檢查一下pickle stream)如果你想通過代碼通過繞過文件系統的線路,這是可能的(但也許你應該在這裏提出一個單獨的問題) - 或者只是像在字符串中傳遞Python代碼,另一邊用'exec'編譯它,或者編譯它到一個代碼對象並通過它。但是,你不能像這樣複製Numpy。 –