2014-09-25 68 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