gpt4 book ai didi

python - py2app'ed 应用程序在别名模式下正常运行但在捆绑时不能

转载 作者:行者123 更新时间:2023-11-28 17:52:07 25 4
gpt4 key购买 nike

我有一个 pyobjc 应用程序运行在一个仅 32 位的 python 构建中,它使用了 gevent 库。在 py2app 的别名模式下一切都很好,但是一旦我构建了一个应用程序包,gevent 模块就找不到 httplib 库,即使它与 site-packages 目录捆绑在一起也是如此。

File "gevent/monkey.pyo", line 182, in patch_httplib
File "gevent/httplib.pyo", line 8, in <module>
ImportError: No module named httplib

我试过按照建议进行错误导入(即使模块似乎已打包),但无济于事。它可以找到 gevent.httplib 模块,但找不到它应该打补丁的模块。这可能是猴子修补功能的问题吗?

编辑:看起来 find_module 无法与我的 py2app 包一起正常工作。有解决方法吗?我不认为点缀模块有问题,因为 httplib 没有点缀(它是核心 python 库的一部分)

编辑 2:所以它肯定是 imp.find_module。使用 import('httplib') 而不是 load_module 修复了它,但我不得不删除 sys.modules 中对 'httplib' 的引用,因为如果它已经加载,它就不能猴子补丁。我不认为这是正确的方法,尽管构建的应用程序包可以正常工作(httplib 现在是猴子补丁并允许使用 HTTPSConnection 进行初始化)。这个 py2app 问题有任何解决方法/修复方法吗?

最佳答案

这有点棘手,涉及更多补丁,但绝对可以解决:

def main():

# Patch the imp standard library module to fix an incompatibility between
# py2app and gevent.httplib while running a py2app build on Mac OS-X.
# This patch must be executed before applying gevent's monkey patching.
if getattr(sys, 'frozen', None) == 'macosx_app':

import imp, httplib

original_load_module = imp.load_module
original_find_module = imp.find_module

def custom_load_module(name, file, pathname, description):
if name == '__httplib__':
return httplib
return original_load_module(name, file, pathname, description)

def custom_find_module(name, path=None):
if name == 'httplib':
return (None, None, None)
return original_find_module(name, path)

imp.load_module = custom_load_module
imp.find_module = custom_find_module

# Verify that the patch is working properly (you can remove these lines safely)
__httplib__ = imp.load_module('__httplib__', *imp.find_module('httplib'))
assert __httplib__ is httplib

# Your application here

if __name__ == '__main__':
main()

此解决方案比简单修改 gevent.httplib 更复杂,但至少适用于 gevent 0.13 发行版。我还没有尝试使用最近发布的 gevent 1.0 alpha 版本。

关于python - py2app'ed 应用程序在别名模式下正常运行但在捆绑时不能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8029082/

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