如何使用Pyinstaller打包具有相关文件的应用程序?

时间:2018-02-04 17:48:45

标签: python-3.x pyinstaller

我想在.exe本身中包含shapefile。 当我运行以下spec file时,我的.exe已创建,但我必须在同一文件夹中包含我的shapefile才能运行我的应用程序。 我想知道我是否可以使用shapefile列表打包我的应用程序,以便我的应用程序是自治的,并且不需要其他文件。

规范文件:

# -*- mode: python -*-

block_cipher = None

a = Analysis(['map.py'],
             pathex=['C:\\Users\\...\\PyQt5\\Qt\\bin', 'C:\\Users\\...\\Applications'],
             binaries=[],
             datas=[('C:\\Users\\...\\Applications\\data', 'dir')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)


pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='XXX',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=False )

仅供参考:我将所有shapefile保存在以下地址:C:\ Users \ ... \ Applications \ data

谢谢

1 个答案:

答案 0 :(得分:0)

如何在python代码中引用外部文件?一旦应用程序捆绑在一起,外部文件将保存在一个临时目录中,您需要参考该目录。有关引用这些外部文件的讨论,请参阅此post。简而言之,您需要在引用之前更新资源文件的路径:

#resource_path is the relative path to the resource file, which changes when built for an executable
def resource_path(relative_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath('.')
return os.path.join(base_path, relative_path)

并在您的代码正文中:

file = resource_path('data.txt')