我正在尝试使用PyInstaller构建一个单文件EXE,它包含一个图像和一个图标.我无法为我的生活而努力--onefile.
如果我这样做--onedir,一切工作都很顺利.当我使用时--onefile,它找不到引用的附加文件(运行编译的EXE时).它找到了DLL和其他一切都很好,只是不是两个图像.
我查看了运行EXE时生成的temp-dir(\Temp\_MEI95642\例如),文件确实在那里.当我将EXE放入该临时目录时,它会找到它们.非常困惑.
这是我添加到.spec文件中的内容
a.datas += [('images/icon.ico', 'D:\\[workspace]\\App\\src\\images\\icon.ico', 'DATA'),
('images/loaderani.gif','D:\\[workspace]\\App\\src\\images\\loaderani.gif','DATA')]
Run Code Online (Sandbox Code Playgroud)
我应该补充一点,我也试过不把它们放在子文件夹中,没有什么区别.
编辑: 由于PyInstaller更新,标记的较新答案正确.
我正在使用Python 2.6下的PyInstaller,这只是部分支持,因为MS使用他们的清单nonense创建了混乱,现在影响Python,因为它现在是MSVC8编译的.
问题是清单嵌入支持依赖于pywin32扩展来构建这是一个痛苦,因为我在创建virtualenv时没有包含主机的site-packages文件夹(有点打败构建环境中的点)我找不到方法安装所需的扩展,以便PyInstaller可以访问它们.
有没有人找到解决这个问题的方法?
我有一个驻留在单个.py文件中的应用程序.我已经能够让pyInstaller成功地将它捆绑到一个EXE for Windows中.问题是,应用程序需要一个始终位于同一目录中的应用程序旁边的.cfg文件.
通常,我使用以下代码构建路径:
import os
config_name = 'myapp.cfg'
config_path = os.path.join(sys.path[0], config_name)
Run Code Online (Sandbox Code Playgroud)
但是,当从pyInstaller生成的EXE调用sys.path时,它似乎是空白的.当您运行python交互式命令行并尝试获取sys.path [0]时,会发生同样的行为.
有没有更具体的方法来获取当前运行的应用程序的路径,以便我可以找到相对于它的文件?
安装docker和docker-compose后:
NAME="Red Hat Enterprise Linux Server"
VERSION="7.6 (Maipo)"
Run Code Online (Sandbox Code Playgroud)
执行时:
sudo docker-compose -version
Run Code Online (Sandbox Code Playgroud)
它返回:
Error while loading shared libraries: libz.so.1: failed to map segment from shared object: Operation not permitted
它应该返回:
docker-compose version 1.25.0-rc2, build 661ac20e
Run Code Online (Sandbox Code Playgroud)
从 docker-compose 安装是这样的
我有一个用Python编写的应用程序,并使用PyInstaller进行"编译".它还使用PyQt作为GUI框架.
在主窗口加载并显示之前,运行此应用程序会有大约10秒的延迟.据我所知,这不是因为我的代码缓慢.相反,我怀疑这是由于Python运行时初始化.
问题是该应用程序是使用自定义的laucncher /任务栏应用程序启动的.用户将单击按钮以启动应用程序,看不到任何内容,并单击其他应用程序上的其他位置.当我的应用程序显示它的窗口时,由于SetForegroundWindow的规则,它无法到达前台.
我可以访问PyInstaller win32加载器,Python代码甚至启动器代码的源代码.
我的问题是:
如何让这个应用程序更快启动?
如何衡量流程生命周期的前几秒花费的时间?
在第一个窗口显示之前减少时间的普遍接受的技术是什么?
我想避免添加启动画面有两个原因 - 一个,我希望它不会有帮助(开销是在Python代码运行之前)和两个,我只是不喜欢启动画面:)
如果我需要,我可能编辑PyInstaller加载器存根来创建一个窗口,但这是另一条我不想采取的路径.
这是我第一次在这里发布问题,因为我的大部分问题已经被其他人回答了!我正在使用 python 开发 GUI 应用程序,并尝试使用 pyinstaller 将其打包到单个文件夹和 .exe 中,以便于移植。目前,我使用 windows 10 和 anaconda3 来管理我的 python 包。该应用程序依赖于 tkinter、pillow、numpy、scikit-learn、opencv、ffmpeg 和 matplotlib。该应用程序使用一个主 GUI.py 文件进行格式化,该文件创建了许多其他文件的对象(其中许多文件存储在子文件夹中,因为此 GUI 正在替换用于相同目的的命令行实用程序)。我遇到的问题(如您在标题中所见)是 .exe 抛出错误块:
回溯(最近一次调用):文件“site-packages\PyInstaller\loader\rthooks\pyi_rth_pkgres.py”,第 11 行,在文件“c:\users\gurnben\anaconda3\envs\opencv\lib\site-packages\”中PyInstaller\loader\pyimod03_importers.py”,第 389 行,在 load_module exec(bytecode, module. dict ) 文件“site-packages\setuptools-20.7.0-py3.5.egg\pkg_resources__init__.py”,第 68 行,在文件中"site-packages\setuptools-20.7.0-py3.5.egg\pkg_resources\extern__init__.py", line 60, in load_module ImportError: The 'packaging' package is required; 通常这与此软件包捆绑在一起,因此如果您收到此警告,请咨询您的发行版的打包人员。无法执行脚本 pyi_rth_pkgres
当我查看warn.txt 时,它给出了大量丢失包的列表,其中包括一些实际上位于单个文件夹包中的包的一部分。
但是,我已经成功地让它识别了来自 opencv 的 dll 文件,并且它没有被列在缺失的列表中(ffmpeg 也没有列出,但是我在文件夹中没有看到任何 ffmpeg 文件)。我必须传入一个自定义路径以使其包含 opencv 文件,因为它们此时不在 anaconda 中。
下一步故障排除步骤的任何提示或想法?我非常感谢您提供的所有帮助,我可以上传任何代码、文件等,以帮助您诊断问题。与此同时,我将继续自己寻找解决方案!
我正在使用python构建一个桌面应用程序,并使用Pyinstaller将其打包到exe.我想通过安装程序发送我的应用程序,并为Google Chrome,Dropbox或Github for Windows等软件提供自动和静默的更新.
我发现以下软件能够做到这一点:
我正在努力找到解决问题的最简单方法.
我最近为我的祖父使用Python和Tkinter的GUI编写了一个相当简单的程序,它可以很好地用于他将要使用的内容.但是,当然还有丑陋的控制台输出窗口.我通过简单地将文件的扩展名从.py更改为.pyw来成功摆脱它.当我使用PyInstaller冻结它时,它再次出现!我有什么方法可以解决这个问题吗?
提前致谢.
简短问题
在构建pyinstaller可执行文件时,有没有办法控制/保证架构(32位对64位)?
背景
我从py2exe迁移到pyinstaller,因为缺乏64位支持以及一些我很难看过去的小东西.所以在那个说明中,我宁愿不回到它.我使用Python 2.7 64位开发了两个应用程序,并且在32位机器上运行时遇到了性能问题.
第一个是简单的wxPython GUI(版本2.9),并连接到USB驱动程序的Windows DLL文件.这个以32位运行似乎非常"安全",因为没有只有64位的模块.但是,在32位Windows XP上运行时,此应用程序在与USB设备通信时会出现严重的性能问题.
第二个应用程序要大得多,我还没有尝试构建和运行,因为担心架构问题.此应用程序中使用了多个64位模块(一个psycopg2).如果无法以32位可执行文件的形式运行,我想远离尝试构建它.
目前的想法
我觉得这可能是可能的(如果模块有32位支持),可以通过在32位模式下强制运行build.py来运行.这有意义吗?
更新
我在我正在建设的第一个项目上取得了一些突破.事实证明,性能问题完全取决于两台机器的速度.我的开发机器有足够的能力足够快地轮询USB设备,而速度慢得多的测试平台(Windows XP)没有.
我通过修改我轮询USB端口的方式修复了这个问题.既然已经修复了,我可以在两个系统上运行exe.尝试将可执行文件构建为单个文件时出现了一个新问题.当运行pyinstaller的Build.py时,它会提取应用程序运行所需的所有DLL.这看起来效果很好,但是当我尝试运行我在Windows 7 64bit上构建的单个exe时,它不能在Windows XP上运行,因为USB加密狗的DLL未被识别为有效的DLL.
为了让单个exe在两个系统上运行,我首先尝试从.spec文件中删除DLL(它似乎是一个python脚本).这很方便,因为我能够使用普通的python列表修饰符修改构建命令之前的包含列表.我希望如果在exe的临时目录中找不到DLL,它会在系统路径上找到它.虽然这种方法可能有效,但我无法在不丢失大量错误的情况下运行它.
我的第二次尝试是在Windows XP机器上构建应用程序(保留嵌入的DLL),希望Win XP DLL可以在Windows 7中运行.成功!这种配置效果很好; 但我坚信这不是最好的解决方案,因为它完全取决于在较新的操作系统上运行的旧DLL.
pyinstaller ×10
python ×9
windows ×3
32bit-64bit ×1
auto-update ×1
docker ×1
executable ×1
ffmpeg ×1
linux ×1
nsis ×1
opencv ×1
performance ×1
redhat ×1
usb ×1
virtualenv ×1
winapi ×1