2014-09-25 163 views
0

假設我有第三方庫,我不允許修改。假設它被稱爲織物,但這只是解釋症狀的重要。交換功能實現不起作用

該腳本處理現有文件的列表,以使用fabric.operations.get來獲取它們,依次調用fabric.sftp.SFTP.get。使用fabric.sftp.SFTP.get產生了一些Warning: get() encountered an exception while downloading ... Underlying exception: Permission denied。我注意到的落實是太陳舊了,交換該函數的一個使用sudo來工作Permission denied圍繞實現:

import fabric.sftp 
def sftpget(....same args as in current implementation....): 
    ...here I pasted fabric.sftp.SFTP.get from the Internet 
# swapping the implementation 
fabric.sftp.SFTP.get=sftpget 

這個工作的情況下的99.999%。但是獲取三個文件仍然會導致相同的錯誤。我試圖看看是否是由其他代碼路徑引起的,但打印該字符串的唯一地方是中的except:子句(對get() encountered an exception while downloading爲grepped /usr/lib/python2.6/site-packages/)。我嘗試將該函數交換爲將打印異常的堆棧跟蹤的實現,但我仍然只獲取Permission denied消息,而沒有堆棧跟蹤

看起來這個函數在這種情況下不會被交換。

有些調用使用原始fabric.operations.get的原因是什麼(因爲我沒有看到打印的堆棧軌跡)(可能還有未修補的fabric.sftp.SFTP.get,因爲它似乎沒有使用sudo修復程序 - 我沒有手動檢查那些操作可以在這些文件上完成)?在導入過程中

回答

0

,更換get函數之前的一些其他的代碼可能會保存到get函數的引用,例如:

class a(): 
    def __init__(self,getter): 
     self.getter=getter 

b=a(sftp.SFTP.get) 

類A則仍然堅持舊件的參考代碼儘管在命名空間中被替換爲你。

+0

如何找到罪魁禍首? – 2014-09-25 13:57:12

+0

可能隱藏得很好,可能很容易通過查找代碼「SFTP.get」 – 2014-09-26 09:09:00