首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法访问数据文件夹的Pyinstaller

无法访问数据文件夹的Pyinstaller
EN

Stack Overflow用户
提问于 2020-07-30 14:09:53
回答 1查看 597关注 0票数 0

下面是我创建的game.spec文件。当运行下面的命令时,应用程序将被完美地创建

代码语言:javascript
复制
pyinstaller --onefile game.spec

当操作游戏时,它无法找到任何数据文件。进一步研究发现,它搜索目录/Users/username中的所有数据文件,而不是从程序运行的绝对路径中搜索。

规范文件是否需要以不同的方式编写?

代码语言:javascript
复制
# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['game.py'],
             pathex=['/Users/username/pythonenv/mygame'],
             binaries=[],
             datas=[('images','images'),
('fonts','fonts'),
('sounds','sounds'),
('pygame','pygame'),
('pygameMenu','pygameMenu'),
('pgzero','pgzero'),
('numpy','numpy'),
('pgzrun.py','.')],
             hiddenimports=[],
             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='game',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name='game')
app = BUNDLE(coll,
             name='game.app',
             icon=None,
             bundle_identifier=None)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-30 22:13:41

当pyInstaller (或cx_Freeze,py2exe等)制作一个可执行文件,所有的程序文件,以及PyGame,Python和其他一些东西都被压缩了。

当它运行时,首先要发生的事情是,文件文件被打开。在某个地方打开。然后启动可执行文件,但不是从解压缩的位置启动。

要解决这个问题,您的脚本必须确定它正在运行的位置--即脚本的完整路径。然后使用这个位置查找所有程序的额外文件。

代码语言:javascript
复制
import sys
import os.path

if getattr(sys, 'frozen', False):
    EXE_LOCATION = os.path.dirname( sys.executable ) # cx_Freeze frozen
else:
    EXE_LOCATION = os.path.dirname( os.path.realpath( __file__ ) ) # Other packers

然后,在加载文件时,用os.path.join确定完整的路径

代码语言:javascript
复制
my_image_filename = os.path.join( EXE_LOCATION, "images", "xenomorph.png" )
image = pygame.image.load( my_image_filename ).convert_alpha()

my_sound_filename = os.path.join( EXE_LOCATION, "sounds", "meep-meep.ogg" )
meep_sound = pygame.mixer.Sound( my_sound_filename )

也许可以使用os.chdir( EXE_LOCATION )设置目录一次,从而减少更改,但我认为小心路径是最好的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63175001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档