你可以打猴子补丁sys.modules
,放置您自己的模块而不是标准模块socket
,在导入可能使用它的任何其他模块之前。
# myscript.py
from myproject import mysocket
import sys
sys.modules['socket'] = mysocket
# ... the rest of your code
import requests
...
为了那个原因,mysocket
应该暴露标准的所有内容socket
does.
# mysocket.py
import socket as _std_socket
from socket import * # expose everything
def create_connection(address, *args, **kwargs):
if address == ...:
address = ...
return _std_socket.create_connection(address, *args, **kwargs)
这可能过于简单化了mysocket.py
应该看起来像。在将其用于生产之前,您可能需要添加一些定义,但您已经明白了。
另一种方法是猴子修补socket
模块本身,即覆盖原始模块内的名称。
# myscript.py
import socket
def create_connection2(...):
...
socket.create_connection = create_connection2
# ... the rest of your code
import requests
...
我更喜欢前一种方法,因为它更干净,因为您不需要去inside模块,只是为了隐藏它并从外部覆盖其中的一些内容。