在我的游戏中,我有很多不同的层次,结构如下:
+ levels/
- Level1.py
- Level2.py
- Level3.py
- ...the包含class Level1,其他的也一样。
我可以导入我的每个等级:
from levels.Level1 import Level1但是由于我有很多这样的函数,而且我想将它们全部导入到同一个位置,所以我编写了一个位于levels/__init__.py中的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打包应用程序。那么pkgutil.iter_modules就什么也不包含了,大概是因为它不能在zip目录中运行(__path__是['/.../dist/main.app/Contents/Resources/lib/python35.zip/levels'])。
我在这里能做什么?是否有一种方法可以将py2app配置为不压缩目录,或者配置pkgutil以在zip文件中工作?
发布于 2016-01-06 10:58:10
问题不在于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__不再是一个真正的dir,所以您需要将它放在一个try/except块中。
https://stackoverflow.com/questions/34630953
复制相似问题