将pkgutil.iter_modules与py2app一起使用

时间:2016-01-06 10:34:49

标签: python py2app

在我的游戏中,我有很多不同的关卡,在以下结构中:

+ levels/
  - Level1.py
  - Level2.py
  - Level3.py
  - ...

Level1.py包含class Level1,所有其他包含{。}}。

我可以导入我的每个级别:

from levels.Level1 import Level1

但由于我有很多这些,并且我想将它们全部导入到同一个地方,我写了一个位于load_levels的{​​{1}}函数:

levels/__init__.py

这非常有用,直到我使用def load_levels(game,window): levels = {} for loader, mod_name, ispkg in pkgutil.iter_modules(path=__path__): #import and initialise level return levels 打包应用程序。然后py2app不包含任何内容,大概是因为它无法在zip目录中运行(pkgutil.iter_modules__path__

我可以在这做什么?有没有办法配置['/.../dist/main.app/Contents/Resources/lib/python35.zip/levels']不压缩目录,或py2app在zip文件中工作?

1 个答案:

答案 0 :(得分:0)

问题不在于pkgutil不起作用,但该模块图并没有打包我的任何级别文件,因为它无法看到''他们在建设时。

要解决此问题,您可以将levels列为setup.py中的包,这将确保捆绑所有内容。但是,它们不会被编译。

如果你想实现相同的目标并确保编译文件,那么解决它的方法是确保__all__中的__init__.py包含所有模块:

for f in os.listdir(__path__):
  mod = os.path.splitext(f)[0]
  if mod not in ['__init__','__pycache__','level_base']:
    __all__.append(mod)

然后将模块添加到includes中的setup.py

现在唯一的问题是此代码赢得在打包的应用内工作,因为__path__不再是真正的目录,所以你会想要把它在try/except块中。