我正在与 pyinstaller 作斗争。每当我使用 kivy GUI 和 .kv 文件构建这个特定脚本,并在构建后运行 .exe 时,我都会收到致命错误:
IOError: [Errno 2] No such file or directory: 'main.kv'
我尝试使用 --add-data 添加 .kv 文件以及 mdb 和 dsn 文件(用于 pypyodbc),但出现错误:
unrecognized arguments: --add-data'main.kv'
。 (提到的其他文件还有更多 --add-data 参数。)
是否有任何解决方案或替代方法?
正如其他人(@Anson Chan,@schlimmchen)所说:
如果您想添加一些额外的文件,您应该使用添加数据文件。
--add-data
datas=
pyinstaller
时生成。
*.spec
文件。pyinstaller
将直接使用您的*.spec
文件。Parameter
逻辑--add-data
或datas=
中的参数:
--add-data
:
{source}{os_separator}{destination}
os_separator
:(使用os.pathsep
)
;
:
source
和 destination
source
:单个或多个文件的路径,支持glob语法。告诉 PyInstaller 在哪里可以找到文件。destination
一个或多个文件:目标文件夹,将在运行时包含源文件。
* 注意:不是目标文件名。
'src/README.txt:.'
'/mygame/sfx/*.mp3:sfx'
'/mygame/data:data'
datas=
added_files = [
( 'src/README.txt', '.' ),
( '/mygame/data', 'data' ),
( '/mygame/sfx/*.mp3', 'sfx' )
]
a = Analysis(...
datas = added_files,
...
)
对于您的(Windows 操作系统),这里是:
--add-data
pyinstaller -F --add-data "main.kv;." yourtarget.py
或:
datas=
在 yourtarget.spec
文件中,请参阅以下内容:a = Analysis(...
datas = ["main.kv", "."],
...
)
如果您检查
pyinstaller -h
寻求帮助,您会发现 --add-data
选项的工作方式如下 [--add-data <SRC;DEST or SRC:DEST>]
。所以在你的情况下尝试
pyinstaller -F --add-data "main.kv;main.kv" yourtarget.py
解决方案是运行:
pyi-makespec yourscript.py
然后编辑 yourscript.spec 脚本并在 a= Analysis 中的 datas 下添加文件。
datas=[ ( '/pathToYourFile/main.kv', '.' )]
然后运行
pyinstaller yourscript.spec
之后应该就好了。
运行 pyinstaller 时假定使用 Next -F 或 --onefile 选项。
pyinstaller 不会添加文件,也不会在该文件夹结构的任何文件夹中创建必要的文件夹;至少不是以任何明显的方式。你不会找到他们的。
print(os.path.dirname(__file__))
将显示每次运行时使用的确切临时文件夹。为了方便起见,我们将其称为 my_app_tmp_folder
,即您的应用程序在文件夹 /var/folder/my_app_tmp_folder
然后,pyinstaller 在此临时文件夹中添加数据文件或创建必要的目录。换句话说,当应用程序运行时,所有添加的文件都将在那里并根据指定的文件夹结构(通过
--add-data
选项)。 print(os.listdir(os.path.dirname(__file__)))
将显示系统和应用程序所需的文件和文件夹。
底线:使用
--add-data
选项指定的文件在运行时将在 /var/folder/my_app_tmp_folder
中可见,而不是在 *.app 文件夹中可见。
文档中的一些有用链接:
https://pyinstaller.readthedocs.io/en/stable/runtime-information.html#using-file
https://pyinstaller.readthedocs.io/en/stable/spec-files.html#adding-files-to-the-bundle
https://pyinstaller.readthedocs.io/en/stable/operating-mode.html#bundling-to-one-file