Pyinstaller:如何包括importlib_resources使用的软件包中的资源

问题描述

我有以下项目结构:

package1/
  __init__.py
  some.py
  package2
    __init__.py
    some.py
    static_data/
      __init__.py
      file1.txt
      file2.txt
      ...
my_script.py

my_script.py包含来自整个结构的导入。除了importlib_resources用法外,Python代码还不错。

我使用importlib_resources(Python 3.6)访问文件,如下所示: importlib_resources.open_text(static_data,'file1.txt').readlines()

使用以下命令构建可执行文件pyinstaller my_script.py -F --noconsole --noupx

在可执行文件中,出现以下错误

File "lib\site-packages\importlib_resources\_py3.py",line 62,in open_text
File "lib\site-packages\importlib_resources\_py3.py",line 52,in open_binary
FileNotFoundError: 'file1.txt' resource not found in 'package1.package2.static_data'

包含与importlib_resources一起使用的资源的正确方法是什么?

解决方法

默认情况下,PyInstaller不会将非二进制文件添加到生成的二进制文件中。您可以使用--add-data选项手动添加它们,如here所述。

假设您正在运行的窗口和正在访问的资源文件都在package1顶级程序包中,则可以尝试以下操作:

pyinstaller my_script.py -F --noconsole --noupx --add-data "package1;package1"
,

脚本中需要数据

import platform
if platform.sys.version.split()[0]>='3.7':
    import importlib.resources as importlib_resources
else:
    import importlib_resources

settings = json.loads(importlib_resources.read_text('packagename','data.json'))

在setup.py

install_requires=[
        'importlib_resources ; python_version<"3.7"'
      ],