在pyinstaller生成的.exe中动态导入自生成的python文件

时间:2018-11-29 19:17:32

标签: python-3.x windows pyinstaller

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

在标准解释器(foo.py)中运行python foo.py时,所有这些工作正常。但是,当我使用pyinstaller创建--onefile .exe时,traylist模块中的值永远不会刷新。我已经使用sys._MEIPASS检查了路径,并且可以看到MEIxxx文件夹中生成的新文件。我只是无法获取.exe才能正确重新加载该模块。

1 个答案:

答案 0 :(得分:0)

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

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