首页 文章

Py2app和Py2exe无法打包Patsy文件

提问于
浏览
0

我一直在使用py2app(Mac OS X 10.6)和py2exe(Win XP和Win7)构建基于python的独立应用程序 . 最近我添加了对依赖于库patsy的函数的支持 . 但是,在构建我的软件的py2app或py2exe版本时,只有“ init .pyc " and " origin.pyc " files from patsy are included in the site-packages.zip patsy folder (excluding the 20 additional python module files). When importing patsy, the standalone app throws the error " ImportError:没有名为highlevel的模块”(highlevel是patsy模块) .

一个丑陋的工作是将丢失的.pyd模块放入site-packages.zip的patsy目录中,但这并不理想 . 显示了py2app代码的一个简单示例,但同样适用于py2exe:

test_import.py

import patsy
print 'hello patsy'

setup.py

includes = ["patsy"]

from distutils.core import setup
import py2app
import patsy
from patsy import highlevel

options = {"py2app":{"includes": includes}}
setup(name='test',app=["test_import.py"],setup_requires=["py2app"])

任何建议都非常感谢 . 谢谢 .

1 回答

  • 1

    问题是patsy在如何定义其主命名空间方面略显过分,请参阅 patsy/__init__.py 的结尾:

    def _reexport(modname):
        __import__(modname)
        mod = sys.modules[modname]
        for var in mod.__all__:
            __all__.append(var)
            globals()[var] = getattr(mod, var)
    for child in ["highlevel", "build", "constraint", "contrasts",
                  "desc", "design_info", "eval", "origin", "state",
                  "user_util", "missing", "splines"]:
        _reexport("patsy." + child)
    

    这避免了一堆复制/粘贴代码重复但是混乱了py2exe和py2app 's heuristics for figuring out which files are in use; because there'没有明确的文字导入语句,他们不能"see"所有这些模块实际上都是导入的 . 真正的解决方案是让py2exe / py2app赶上最近5年的python基础架构开发和信任包' setup.py to install only what' s .

    同时,这是一个非常标准的问题,因此两个包都有办法解决它,例如,对于py2app,这些似乎被称为"recipes":http://pythonhosted.org/py2app/recipes.html

    编辑:替代解决方案:使用刚刚发布的patsy 0.2.1,它有一个稍微不那么聪明 __init__.py 应该Just Work .

相关问题