首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pkgutil.iter_modules与py2app的结合

pkgutil.iter_modules与py2app的结合
EN

Stack Overflow用户
提问于 2016-01-06 10:34:48
回答 1查看 63关注 0票数 0

在我的游戏中,我有很多不同的层次,结构如下:

代码语言:javascript
复制
+ levels/
  - Level1.py
  - Level2.py
  - Level3.py
  - ...

the包含class Level1,其他的也一样。

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

代码语言:javascript
复制
from levels.Level1 import Level1

但是由于我有很多这样的函数,而且我想将它们全部导入到同一个位置,所以我编写了一个位于levels/__init__.py中的levels/__init__.py函数

代码语言:javascript
复制
def load_levels(game,window):
  levels = {}
  for loader, mod_name, ispkg in pkgutil.iter_modules(path=__path__):
    #import and initialise level
  return levels

这很好,直到我使用py2app打包应用程序。那么pkgutil.iter_modules就什么也不包含了,大概是因为它不能在zip目录中运行(__path__['/.../dist/main.app/Contents/Resources/lib/python35.zip/levels'])。

我在这里能做什么?是否有一种方法可以将py2app配置为不压缩目录,或者配置pkgutil以在zip文件中工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-06 10:58:10

问题不在于pkgutil不起作用,而是模块图没有打包我的任何级别文件,因为它不能在构建时“看到”它们。

为了解决这个问题,您可以将levels作为一个包在setup.py中列出,这将确保它的所有内容都捆绑在一起。然而,它们将不会被汇编。

如果您想要实现相同的目标并确保文件被编译,那么一种方法就是确保__all____init__.py中包含所有模块:

代码语言:javascript
复制
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__不再是一个真正的dir,所以您需要将它放在一个try/except块中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34630953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档