Python 交换函数实现不起作用

Python 交换函数实现不起作用,python,Python,假设我有一个不允许修改的第三方库。假设,它被称为织物,但这只对解释症状很重要 脚本使用fabric.operations.get处理现有文件的列表以获取这些文件,该脚本依次调用fabric.sftp.sftp.get。使用fabric.sftp.sftp.get生成了一些警告:get()在下载时遇到异常。。。基础异常:权限被拒绝。我注意到该实现太旧,于是将该函数的实现替换为使用sudo来解决被拒绝的权限问题的实现: import fabric.sftp def sftpget(....same

假设我有一个不允许修改的第三方库。假设,它被称为织物,但这只对解释症状很重要

脚本使用
fabric.operations.get
处理现有文件的列表以获取这些文件,该脚本依次调用
fabric.sftp.sftp.get
。使用
fabric.sftp.sftp.get
生成了一些
警告:get()在下载时遇到异常。。。基础异常:权限被拒绝
。我注意到该实现太旧,于是将该函数的实现替换为使用sudo来解决被拒绝的
权限问题的实现:

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%的案例中有效。但是获取三个文件仍然会导致相同的错误。我试图查看这是否是由其他代码路径引起的,但打印该字符串的唯一位置是
fabric.operations.get
中的
除了:
子句(grepped
/usr/lib/python2.6/site packages/
for
get()在下载时遇到异常)。我尝试将该函数替换为一个将打印异常堆栈跟踪的实现,但仍然只得到
权限被拒绝
消息,而没有堆栈跟踪

在这种情况下,函数似乎不会被交换


某些调用使用原始的
fabric.operations.get
(因为我没有看到打印的堆栈跟踪)(可能还有未打补丁的
fabric.sftp.sftp.get
,因为似乎没有使用sudo fix-我手动检查了这些操作是否可以在这些文件上执行)?

导入期间,在替换get函数之前,其他一些代码可能会保存对get函数的引用,例如:

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

b=a(sftp.SFTP.get)

然后,类a将仍然保留对旧代码段的引用,尽管它在名称空间中被您替换。

如何找到罪犯?可能隐藏得很好,通过搜索“SFTP.get”的代码可能很容易找到