我一直在尝试使用pyinstaller将一个kivy应用程序转换为exe文件,但它一直给我错误。我完全按照website的说法完成了我必须做的事情。
我在用:
Mac mini (Late 2014)
2.6 GHz Intel Core i5
Version 10.12.6
python 3.6.1
PyInstaller: 3.3
Platform: Darwin-16.7.0-x86_64-i386-64bit
kivy 1.10.1
这是我的main.py看起来的样子:
import kivy
kivy.require('1.0.6') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
return Label(text='Hello world')
if __name__ == '__main__':
MyApp().run()
我使用pyinstaller运行以下命令:
pyinstaller -y --clean --windowed --name simple \
--exclude-module _tkinter \
--exclude-module Tkinter \
--exclude-module enchant \
--exclude-module twisted \
main.py
它一直给我这个错误:
我试图忽略它,只是继续做website上所说的话。也就是说,添加树对象:
coll = COLLECT(exe,
Tree('/Users/mohammadmohjoub/PycharmProjects/Kivy'),
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='simple')
并运行以下命令:
pyinstaller -y --clean --windowed simple.spec
现在它变得最糟糕,因为我得到了与上面相同的错误,以及这个新错误:
WARNING: stderr: FileNotFoundError: [Errno 2] No such file or directory: '/Users/mohammadmohjoub/PycharmProjects/Kivy/dist/simple.app/Contents/Resources/lib2to3/Grammar.txt'
ModuleNotFoundError
错误和FileNotFoundError
错误的原因是什么?这是为什么每次我尝试打开应用程序时它立即关闭?如果这不是原因,那么我如何以不会意外关闭的方式构建应用程序?我一直在努力解决这个问题。我真的很感激任何支持。
答案 0 :(得分:0)
1)对于第一个错误(找不到模块)。我很困惑为什么你使用--exclude-module
标志。如果您的项目依赖于这些模块,则需要将它们与脚本一起打包。实际上,您甚至可能需要使用--hidden-import
标志来标识pyinstaller可能找不到的那些模块。
https://pyinstaller.readthedocs.io/en/stable/usage.html
此链接提供有关--hidden-import
标志的信息。但如果所有路径都设置正确,则可能不需要这样做。但作为一个例子:
pyinstaller -y --clean --windowed --hidden-import=module_name simple.py
注意强>
您可能需要提供隐藏导入模块的完整路径。您可以使用--paths="path\to\your\module"
标志添加它。这将告诉pyinstaller在哪里寻找东西。您还可以将完整文件路径添加到--hidden-import
标志。无论哪种方式,您都需要在某处指定完整路径(您也可以在spec文件中编辑pathex变量)。
2)对于第二个错误(找不到文件)。如果您的代码访问外部文件(例如Grammar.txt)。它也需要与pyinstaller捆绑在一起。当pyinstaller编译你的代码时,它会创建一个“dist”目录来运行你的代码,但是你的python脚本(我假设)正在根据原始脚本的相对位置查找这个文件。因此,您需要将文件复制到您的目录,或者在编译时使用--add-data
标志。上面的链接也提供了有关该标志的信息。
pyinstaller -y --clean --windowed --add-data="src:dest" simple.py
另一种解决方案是只编辑spec文件以包含所有内容:
a = Analysis(['minimal.py'],
...
datas=[('src/Grammar.txt', '.'), ('another/src/more.txt', '.')]
hiddenimports=['path_to_import', 'path_to_second_import'],
...
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,... )
coll = COLLECT(...)
app = BUNDLE(...)
然后你可以这样做:pyinstaller your.spec
有关规范文件的更多信息:https://pyinstaller.readthedocs.io/en/stable/spec-files.html