Py2app和Py2exe无法打包Patsy文件

时间:2013-08-20 02:28:47

标签: exception py2exe py2app

我一直在使用py2app(Mac OS X 10.6)和py2exe(Win XP和Win7)构建基于python的独立应用程序。最近我添加了对依赖于库patsy的函数的支持。但是,在构建我的软件的py2app或py2exe版本时,只有来自patsy的“ init .pyc”和“origin.pyc”文件包含在site-packages.zip patsy文件夹中(不包括20个)额外的python模块文件)。导入patsy时,独立应用程序会抛出错误“ImportError:No module named highlevel”(highlevel is patsy module)。

为此做一个丑陋的工作是将丢失的.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 个答案:

答案 0 :(得分: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的启发式,以确定哪些文件正在使用中;因为没有明确的文字导入语句,所以他们无法“看到”所有这些模块实际上都是导入的。 真正的解决方案是py2exe / py2app能够赶上python基础设施开发的最后5年,信任包的setup.py只能安装所需的东西。

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

编辑:替代解决方案:使用刚刚发布的patsy 0.2.1,它稍微不那么聪明__init__.py,应该只是工作。