我使用pygame模块。将上述文件打包成文件夹时无运行错误,但当打包成.exe文件时(-F)无法运行,显示FileNotFoundError。可能是文件路径有误?
我用命令生成了.spec文件:pyi-makespec -F 'main.py' -w -i 'materials/car.ico' -n 'Car v0.1'
之后修改了.spec文件(粗体为修改部分)
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
**['main.py','object_e.py'],
pathex=["C:\Game_Designs\game\Car"],**
binaries=[],
** datas=[("materials", "materials")],**
hiddenimports=[],
hookspath=[],
hooksconfig={},
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,
a.binaries,
a.zipfiles,
a.datas,
[],
**name='Car_v0.1',**
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
**icon=['materials\\car.ico'],**
)
之后用pyinstaller 'Car_v0.1.spec'命令生成.exe文件,出现了FileNotFoundError:
这个是因为 pyinstaller 不会解析资源的路径。你的可执行文件在 dist
文件夹里,而资源路径是 materials/***
,就会尝试在 dist 文件夹里查找这个资源路径,所以就会出错。
把 exe 粘贴到 main.py
同一目录下,或者把 materials 粘贴到 dist 里面就行了。
【以下回答由 GPT 生成】
我可以帮助你解决这个问题。以下是关于如何使用pyinstaller将资源文件和.py文件打包成一个独立的.exe文件的步骤:
步骤一:生成.spec文件 首先,使用pyi-makespec命令生成一个.spec文件。在这个步骤中,你需要指定主要的.py文件、依赖的其他.py文件、资源文件的路径(绝对路径或相对路径)以及其他选项(如图标文件)。
pyi-makespec -F main.py -w -i materials/car.ico -n "Car v0.1"
这个命令将生成一个.spec文件,其中包含了你的打包选项和配置。
步骤二:修改.spec文件 接下来,你需要打开生成的.spec文件并进行修改。找到以下代码段:
a = Analysis(
['main.py', 'object_e.py'],
pathex=['C:\Game_Designs\game\Car'],
binaries=[],
datas=[],
...
)
在datas
中添加你想要包含的资源文件。在你的例子中,将datas
修改为以下内容:
datas=[('materials', 'materials')],
这样,打包时会自动将materials
文件夹下的所有文件包含进去。
步骤三:使用.spec文件打包成.exe文件 最后,使用pyinstaller命令将.spec文件转换为独立的.exe文件。
pyinstaller Car_v0.1.spec
这个命令会根据.spec文件中的配置将所有的文件打包成一个可执行的.exe文件。
希望这个解决方案对你有帮助。如果你还有其他问题,请随时提问。
这个问题在我自作一个文件时出现了多次,我经过多次实验做出来了,推荐你看我的一篇文章http://t.csdn.cn/tvqXy,直接看打包那部分,如果看不懂的话,可以询问我,主要是打包时,没有将文件的所有文件包含,需要自己引入资源的具体链接,或者在相同目录下,使用pyinstaller自己的特殊的打包命令可以将同一目录下的文件所有打包进去,具体可以看我的文章