交换功能实现不起作用
假设我有第三方库,我不允许修改。假设它被称为织物,但这只是解释症状的重要。交换功能实现不起作用
该脚本处理现有文件的列表,以使用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修复程序 - 我没有手动检查那些操作可以在这些文件上完成)?在导入过程中
,更换get函数之前的一些其他的代码可能会保存到get函数的引用,例如:
class a():
def __init__(self,getter):
self.getter=getter
b=a(sftp.SFTP.get)
类A则仍然坚持旧件的参考代码尽管在命名空间中被替换为你。
如何找到罪魁祸首? – 2014-09-25 13:57:12
可能隐藏得很好,可能很容易通过查找代码“SFTP.get” – 2014-09-26 09:09:00