Python py2app';绑定的应用程序在别名模式下正常运行,但在绑定时不能正常运行

Python py2app';绑定的应用程序在别名模式下正常运行,但在绑定时不能正常运行,python,py2exe,monkeypatching,gevent,py2app,Python,Py2exe,Monkeypatching,Gevent,Py2app,我有一个pyobjc应用程序,它运行在一个仅32位的python版本中,该版本利用了gevent库。在py2app'ed alias模式下,一切都很好,但是一旦我构建了一个应用程序包,gevent模块就找不到httplib库,即使它与site packages目录捆绑在一起 File "gevent/monkey.pyo", line 182, in patch_httplib File "gevent/httplib.pyo", line 8, in <module> Import

我有一个pyobjc应用程序,它运行在一个仅32位的python版本中,该版本利用了gevent库。在py2app'ed alias模式下,一切都很好,但是一旦我构建了一个应用程序包,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
补丁_httplib中的文件“gevent/monkey.pyo”,第182行 文件“gevent/httplib.pyo”,第8行,在 ImportError:没有名为httplib的模块 我尝试过按照建议进行错误导入(即使模块似乎已经打包),但没有效果。它可以找到gevent.httplib模块,但不能找到它应该修补的模块。这可能是猴子补丁功能的问题吗

编辑:看来find_模块与我的py2app包不能正常工作。有解决办法吗?我认为虚线模块没有问题,因为httplib没有虚线(它是核心pythonlibs的一部分)


编辑2:所以它肯定是imp.find_模块。使用import('httplib')而不是load_module修复了它,但我不得不删除sys.modules中对'httplib'的引用,因为如果它已经加载了,它就无法进行修补。我不认为这是正确的方法,尽管构建的应用程序包可以正常工作(httplib现在是monkey补丁,允许使用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版本上试用过它。

对我的解决方案还有一点意见:最好弄清楚为什么
imp.find_模块在这种情况下不起作用。我想py2app需要一个新的配方,但这只是一个猜测。对此有什么想法吗?Windows上也需要上述破解,至少在gevent 0.13.7和Python 2.6上是这样。