【问题标题】:Pyinstaller: How to include resources from package used by importlib_resourcesPyinstaller:如何包含 importlib_resources 使用的包中的资源
【发布时间】:2020-10-01 22:09:47
【问题描述】:

我有以下项目结构:

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

【问题讨论】:

    标签: python pyinstaller python-importlib


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      脚本中需要数据

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-04
        • 2018-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多