gpt4 book ai didi

python - 扭曲的服务器: monkey-patch file

转载 作者:太空宇宙 更新时间:2023-11-03 14:15:54 26 4
gpt4 key购买 nike

我在 Docker 内的 Alpine Linux 3.7 上运行 Twisted (Python 2.7.x)。

我现在想使用 twisted.internet.inotify 模块,但加载失败。

它在 twisted.python._inotify 中触发以下异常:

name = ctypes.util.find_library('c')
if not name:
raise ImportError("Can't find C library.")
libc = ctypes.cdll.LoadLibrary(name)
initializeModule(libc)

问题是 Alpine Linux 3.x 有一个错误,导致 ctypes.util.find_library('c') 返回 None

我已将代码与 inotify module 进行了比较,我之前已经在 Alpine 中成功使用过,并且在 the following way 中处理了这个问题。 :

_FILEPATH = ctypes.util.find_library('c')
if _FILEPATH is None:
_FILEPATH = 'libc.so.6'

instance = ctypes.cdll.LoadLibrary(_FILEPATH)

所以我尝试在解释器中调用ctypes.util.find_library('libc.so.6'),并且调用成功。

我现在想做的是猴子补丁twisted.python._inotify,以便它加载libc.so.6而不是c,但我不知道如何做到这一点,因为我根本无法加载模块。

我有一个选择,那就是在docker build期间sed源代码,或者甚至可能在服务器启动后立即在服务器内部,但这感觉像是一种黑客攻击.

我已经看到 Twisted 包含 MonkeyPatch 模块,但我不知道如何使用它,或者它是否适合此任务。

如何以最干净的方式解决这个问题?

<小时/>

注意:服务器以非 root 身份运行,因此它没有对 /usr/lib/python2.7/site-packages/twisted/python/_inotify.py 的写入权限。

这意味着我要么必须在 Dockerfile 中对其进行 sed,要么在服务器启动时在加载模块之前在内存中进行修补(如果可能的话,我更愿意这样做) .

最佳答案

除此之外,我希望您为 Twisted 贡献一个补丁,以彻底解决此问题,或者使其更容易从应用程序代码或操作级别解决。

也就是说,这是一个应该适合您的猴子补丁:

import ctypes.util
def fixed_find_library(name):
if name == "c":
result = original_find_library(name)
if result is not None:
return result
else:
return "libc.so.6"
return original_find_library(name)
original_find_library = ctypes.util.find_library
ctypes.util.find_library = fixed_find_library

# The rest of your application code...

这只需将您建议解决问题的问题的逻辑编入代码即可。只要此代码在导入 _inotify.py 之前运行,那么当它被导入时,它最终将使用“固定”版本而不是原始版本。

关于python - 扭曲的服务器: monkey-patch file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48234723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com