【问题标题】:Dynamically import self-generated python files within a pyinstaller generated .exe在 pyinstaller 生成的 .exe 中动态导入自生成的 python 文件
【发布时间】:2018-11-29 19:17:32
【问题描述】:

Pyinstaller 3.4 Python 3.7 (Windows 7)

我有一个用例,我的主要 python 脚本 foo.py 生成一个我想从中导入内容的 traylist.py 文件。 foo.py 偶尔需要更新这个 traylist.py 文件。因此,foo.py 需要能够在函数中再次导入该traylist.py。我使用这样的重新加载模块函数来完成此操作:

import traylist importlib.reload(traylist) menu_def = traylist.menu_def

我也尝试了以下代码,结果相同(在解释器中工作,但在作为 .exe 运行时失败)

import traylist del sys.modules['traylist'] import traylist menu_def = traylist.menu_def

当在普通解释器 (python foo.py) 中运行 foo.py 时,所有这些都有效。但是,当我使用 pyinstaller 创建--onefile .exe 时,traylist 模块中的值永远不会刷新。我使用 sys._MEIPASS 检查了路径,可以看到在 MEIxxx 文件夹中生成的新文件。我只是无法让 .exe 正确地重新加载该模块。

【问题讨论】:

    标签: python-3.x windows pyinstaller


    【解决方案1】:

    事实证明,虽然 pyinstaller 允许您捆绑其他类型的文件并通过 sys._MEIPASS 路径访问它们,但这不适用于 import module 语句。它有一种单独的方式来处理这些类型的文件,并且不能轻易更改,从而导致重新加载同一原始模块的陈旧副本。

    解决方案是通过提供完整路径来加载模块。他们有多种方法来实现这一点,但对我有用的是this 答案中的一种。首先我必须做一个pip install import_file,然后: from import_file import import_file traylist = import_file(traylist_path)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 2020-12-17
      • 2021-06-22
      • 1970-01-01
      相关资源
      最近更新 更多