如何重载Python中的内置模块?

2024-01-09

我正在尝试将主机绑定到我的 python 程序中的指定 ip。只是让它在python程序中起作用,所以我不打算修改/etc/hosts file.

我尝试添加一些代码create_connection函数于socket.py对于主机 IP 转换,如下所示:

host, port = address  # the original code in socket.py
# My change here:
if host == "www.google.com":
    host = target_ip  
for res in getaddrinfo(host, port, 0, SOCK_STREAM): # the original code in socket.py

我发现效果很好。

现在我希望主机 IP 转换只能在这个 python 程序中起作用。

所以我的问题是:我怎样才能让我的python程序在使用时导入这个socket.py而不是内置的import socket?

为了清楚起见,这里有一个例子。假设“test”是我的工作目录:

test
|--- main.py
|--- socket.py

在这种情况下:

  1. 如何使 main.py 使用 test/socket.pyimport socket?

  2. 如何让其他模块使用 test/socket.py 使用import socket?

我认为更改模块查找路径顺序可能会有所帮助。但我发现即使当前路径('') 位于第一位sys.path已经和import socket仍然导入内置的 scoket 模块。


你可以打猴子补丁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模块,只是为了隐藏它并从外部覆盖其中的一些内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何重载Python中的内置模块? 的相关文章

随机推荐

  • 使用 Box 分配大型数组时,线程“
    ”溢出了堆栈

    我正在实施combsort http kokizzu blogspot com 2015 01 c java phphhvm ruby nodejs go combsort html 我想在堆栈上创建固定大小的数组 但它显示stack ov
  • 解析未声明的参数

    我正在编写一个用于运行 bash 命令的实用程序 该实用程序本质上将字符串和列表可选参数作为输入 并使用可选参数来插入字符串 我希望它像这样工作 interpolate py Hello user arg my name is comput
  • PHP cURL:修改/覆盖连接标头

    使用 PHP cURL 库 我可以操作 HTTP 标头 但是怎么样 联系标题 当我发送任何请求时 cURL 总是将其附加连接 保持活动状态当我尝试将此标头修改为这个标头时连接 保持活动状态 小写 keep alive 它会附加两行作为结果
  • Kafka 更新元数据失败

    我正在使用 Kafka v0 10 1 1弹簧启动 我正在尝试在 Kafka 主题中生成一条消息mobile user使用以下生产者代码 Topic mobile user有 5 个分区和 2 个复制因子 我已附上我的问题末尾的Kafka设
  • 使用 ie10 的 webbrowser c# winform

    我想强制网络浏览器在我的 c winform 应用程序中使用 IE10 我知道还有其他类似的问题 但我已经阅读了很多 但我不知道我错在哪里 这是我的代码 RegistryKey registrybrowser Registry LocalM
  • 为什么 jQuery 不使用 JSDoc? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 或者它们确实存在 但只是不在源代码中 我真的很想得到一些东西 可以阻止 js doc toolkit 每次解析 jQuery 时崩溃 这也意味着
  • 如何将 XML 发布到 MVC 控制器中? (而不是键/值)

    使用 Fiddler 我可以传入 body someXml ThisShouldBeXml 然后在控制器中 HttpPost public ActionResult Test object someXml return Json someX
  • C++ 中的可扩展自动类注册

    C 中的自动类注册是一项常见任务 也是 StackOverflow 上的一个常见问题 在对象工厂中注册对象创建者 https stackoverflow com questions 1310214 register an object cr
  • 如何在 app.config 文件中定义端点?

    如何在 app config 文件中使用 MEX 端点定义端点以及运行应用程序所需的内容 我有一个名为 IXMLService 的服务合同 并且我正在使用 WsHttpBinding 请举个例子 创建app config后 如何启动服务
  • 将一个 Div 插入到另一个 Div 中?

    我正在创建一个网络应用程序 想知道为什么以下代码不起作用 它首先创建一个元素 然后将其添加到主体中 然后 我创建另一个 Div 元素 我想将其放置在我创建的第一个 div 元素内 我使用 MooTools 类来创建和初始化对象 它工作正常
  • 挑战:ViewPager 的自定义动画。更改所选元素的高度(视图折叠)

    我目前正在研究 ViewPager 中切换页面之间的自定义动画 当我向左滑动时 视图向左移动 新视图从其下方来到前面 我想让视图向左移动 我处理的 以缩小 如下图所示 在第二张和第三张图片中 我没有想象新的视图出现在前面 但我认为这是没有必
  • 将 vsDoc 更新到 1.5 会破坏所有 JavaScript

    我在看似最简单的操作上遇到了一些困难 在 Visual Studio 中 当我将 vsDoc 从 1 4 1 更改为 1 5 时 页面上的 JavaScript 不再起作用 视觉工作室 2010 原来的 有效的 是这样的
  • 不可知地检查 unittest.mock 调用参数。它们是否作为位置参数或关键字参数传递

    When a unittest mock Mock对象已被调用 我可以使用调用的确切签名检查参数值 from unittest mock import Mock m Mock creation of mock m foo bar baz c
  • XNA C# 2D 平台游戏

    我正在尝试在 XNA 中制作 弄清楚如何 一个 2d 平台游戏 我知道如何创建平铺网格以及如何执行碰撞检测 我对玩家的 9 个边界图块执行碰撞检测 但我想知道是否有更好的方法来执行碰撞检测 我读过 时空幻境 不使用图块 而是使用拼凑的图像或
  • 当名称可以是任何语言时,如何按名称索引 postgres 表?

    我有一个很大的 postgres 表 其中包含位置 商店 地标等 用户可以通过各种方式进行搜索 当用户想要搜索某个地点的名称时 系统当前会执行以下操作 假设搜索是在咖啡馆 lower location name LIKE cafe 作为查询
  • 在css中为文件上传按钮添加样式

    我有一个带有以下 css 的文本字段和按钮 JS 小提琴链接 http jsfiddle net Tdkre http jsfiddle net Tdkre submit moz box shadow inset 0px 1px 0px 0
  • 如何防止删除Android中编辑文本的第一个字符

    这是我在应用程序中编辑文本之一
  • 如何迭代 C# 中的内置类型?

    我想迭代 C 中的内置类型 bool char sbyte byte short ushort 等 怎么做 foreach var x in GetBuiltInTypes do something on x 系统类型代码 http msd
  • 我们可以访问不存在的工会的成员吗?

    在 C 标准中 基本 lval 11 6 http eel is c draft basic lval 11 6 says 如果程序尝试通过以下类型之一以外的泛左值访问对象的存储值 则行为未定义 聚合或联合类型 其元素或非静态数据成员中包含
  • 如何重载Python中的内置模块?

    我正在尝试将主机绑定到我的 python 程序中的指定 ip 只是让它在python程序中起作用 所以我不打算修改 etc hosts file 我尝试添加一些代码create connection函数于socket py对于主机 IP 转