执行Plotly Dash .exec文件时出现PyInstaller错误

时间:2020-01-25 22:53:45

标签: python plotly pyinstaller plotly-dash

我正在尝试创建一个.exe文件来运行用Plotly Dash创建的python仪表板。一旦我使用PyInstaller创建文件并尝试运行它,就会出现此错误:

Traceback (most recent call last):
  File "app.py", line 2, in <module>
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "/Users/mohamedmartino/opt/anaconda3/lib/python3.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 623, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages/dash_core_components/__init__.py", line 12, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/var/folders/np/m30g9mj57h72n68qxc2tq61m0000gn/T/_MEI2yKNs4/dash_core_components/package-info.json'
[85571] Failed to execute script app
  • 我是编码的新手,我不知道为什么找不到dcc
    依赖性。有没有更好的方法可以将我的模块编译成一个
    可执行文件?

我有一些python模块和excel文件,以及带有图像和CSS文件的-asset文件夹。

2 个答案:

答案 0 :(得分:4)

似乎我们需要修改.spec文件(请参见下面的sample.spec)。
修改规范文件后,在控制台中输入“ pyinstaller ***。spec”(似乎“ --onefile”选项不起作用),然后可以从浏览器连接破折号URL。

#Sample.spec
# -*- mode: python ; coding: utf-8 -*-

#manually add Start to avoid rerusion limit error==>
import sys
sys.setrecursionlimit(5000)
#manually add End<==

block_cipher = None


a = Analysis(['dashtest.py'],
             pathex=['C:\\Users\\Owner\\Documents\\python\\Simulatortest\\sandbox'],
             binaries=[],
             #modified Start==>
             datas=[
                 ('C:\\Users\\Owner\\anaconda3\\pkgs\\dash-core-components-1.3.1-py_0\\site-packages\\dash_core_components\\', 'dash_core_components'),
                 ('C:\\Users\\Owner\\anaconda3\\pkgs\\dash-html-components-1.0.1-py_0\\site-packages\\dash_html_components\\', 'dash_html_components'),
                 ('C:\\Users\\Owner\\anaconda3\\pkgs\\dash-renderer-1.1.2-py_0\\site-packages\\dash_renderer\\','dash_renderer'),
                 ],
             hiddenimports=['pkg_resources.py2_warn'],
             #modified End<==
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='dashtest',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name='dashtest')

答案 1 :(得分:2)

如果Pyinstaller在查找文件(例如Python模块)时遇到问题,则可以将该地址作为Tuple添加到.spec文件的datas数组中。正如Pyinstaller documentation所说,

  • 第一个字符串指定文件所在的位置 系统。
  • 第二个指定要包含的文件夹的名称 文件在运行时。

在文档中,他们有以下示例:

a = Analysis(...
     datas= [ ('/mygame/sfx/*.mp3', 'sfx' ) ],
     ...
     )

结果如下:

/ mygame / sfx文件夹中的所有.mp3文件都将复制到捆绑的应用程序中名为sfx的文件夹中。

例如,如果Pyinstaller找不到Plotly Python模块,那么您将找到Plotly模块在计算机或虚拟环境中的安装位置,然后将其位置复制到数据数组中(例如,一个名为“ virtual_env_name”的虚拟环境):

             datas=[
                    ('C:\\Users\\Nicolas\\.virtualenvs\\virtual_env_name\\Lib\\site-packages\\dash_core_components', 'dash_core_components'),
                    ('C:\\Users\\Nicolas\\.virtualenvs\\virtual_env_namea\\Lib\\site-packages\\dash_html_components\\', 'dash_html_components'),
                    ('C:\\Users\\Nicolas\\.virtualenvs\\virtual_env_name\\Lib\\site-packages\\dash_renderer\\', 'dash_renderer'),
                    ('C:\\Users\\Nicolas\\.virtualenvs\\virtual_env_name\\Lib\\site-packages\\plotly', 'plotly'),
                    ],

这样做,Pyinstaller知道所有这些模块在哪里,并且我可以使用以下行(如果我未使用虚拟环境)创建可执行文件:

pyinstaller python_script_name.spec

或者如果您有一个像我一样的虚拟环境,请首先激活该虚拟环境:

pipenv shell

然后运行:

pyinstaller python_script_name.spec

如果您继续收到其他文件/模块的“ FileNotFoundError”,则将丢失的文件(或Python模块)的位置添加到datas数组中。

或者,在Pyinstaller创建可执行文件时,您的防病毒软件有可能“隔离”安装文件。因此,如果数据阵列解决方案不起作用,则可以在创建可执行文件(.exe文件)期间尝试暂时禁用防病毒软件或其文件扫描功能。