使用py2exe处理动态导入

4

我在使用py2exe为我的应用程序准备.exe文件时遇到了问题。这个问题的源头是我创建的以下函数,用于使用动态定义模块中的类。

def of_import(module, classname, country = None):
    '''
    Returns country specific class found in country module
    '''
    if country is None:
       country = CONF.get('simulation', 'country')
    _temp = __import__(country + '.' + module, 
                       globals = globals(), 
                       locals = locals(), 
                       fromlist = [classname], 
                       level=-1)
    return getattr(_temp, classname, None)

当我尝试使用以下代码加载某些类:

self.InputTable = of_import('model.data', 'InputTable')

运行.exe文件时,我遇到了以下错误:
File "core\utils.pyc", line 900, in of_import
ImportError: No module named france.model.data

我应该明确一下,france.model.data.py是存在的。

如何处理这个问题?

以下是设置文件的链接信息:https://github.com/openfisca/openfisca/blob/dev/src/setup_x64.py


两个问题:france.model.data.py 模块文件是否存在?如果存在,那么这段代码是在使用 py2exe 编译后才出现问题的吗? - martineau
相关的代码应该是你的 setup.py 用于 py2exe。我们能看到吗?它需要包括模块,因为它们不会被 py2exe 自动发现。 - jdi
我编辑了问题以回答@martineau的问题。 - benjello
问题中添加的链接已在@jdi的答案中提供。 - benjello
由于该模块确实存在,这听起来像是搜索路径问题。尝试按此处所述设置PY2EXE_VERBOSE环境变量为1或2,以进一步诊断问题。 - martineau
更合理的做法是,将特定于位置的模块子包装到类似“lang”包中。然后您就不必在设置过程中显式地包含它们所有。只需包含“lang”包即可。 - jdi
1个回答

3

我有一个类似的设置

确保您在py2exe的“packages”部分中添加动态模块

setup(windows=[{
                "script" : "openFisca.pyw"
                }], 
      options={"py2exe" : {"includes" : ["sip", "encodings.*", "numpy.*"],
                           "packages": ["france","tunisia"],
                           "dist_dir": dist_dir,
                           "bundle_files":3,
                           "dll_excludes": ["MSVCP90.dll"]
                           }}, 
      data_files=data_files)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接