py2app的应用程序在alias模式下正常运行,但在绑定时不能正常运行

2024-05-29 08:24:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pyobjc应用程序在一个32位的python构建中运行,它使用gevent库。在py2app'ed alias模式下一切都很好,但是一旦我构建了一个app bundle,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_模块与我的py2app包不能正常工作。有解决办法吗?我不认为这是点式模块的问题,因为httplib不是点式的(它是核心python库的一部分)

编辑2:确实如此imp.find_模块. 使用import('httplib')而不是load\u module修复了它,但是我不得不删除了对中“httplib”的引用系统模块因为如果它已经加载了,它就不能运行。不过,我不认为这是正确的方法,尽管构建的应用程序包可以正常工作(httplib现在是monkey补丁,允许使用HTTPSConnection初始化)。有没有解决这个py2app问题的方法?在


Tags: 模块方法in编辑linegeventfindhttplib
1条回答
网友
1楼 · 发布于 2024-05-29 08:24:02

这有点棘手,需要更多的修补,但绝对可以解决:

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更复杂,但至少可以使用stock gevent 0.13分布。我还没有在最近发布的gevent1.0alpha版本上尝试过。在

相关问题 更多 >

    热门问题