0

我一直在使用 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 是 patsy 模块)。

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

test_import.py

import patsy
print 'hello patsy'

安装程序.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"])

非常感谢任何建议。谢谢。

4

1 回答 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 的启发式方法来确定哪些文件正在使用;因为没有明确的文字导入语句,他们无法“看到”所有这些模块实际上都被导入了。真正的解决方案是让 py2exe/py2app 赶上过去 5 年的 python 基础设施开发并信任包的 setup.py 以仅安装所需的内容。

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

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

于 2013-08-20T14:16:00.537 回答