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

时间:2020-10-01 22:09:47

标签: python pyinstaller python-importlib

我有以下项目结构:

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一起使用的资源的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

脚本中需要数据

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"'
      ],