构建包含 netcdf4 的 python 发行版时出现问题

problems building python distribion containing netcdf4

我正在尝试使用 pyinstaller 创建 python 发行版,但没有成功。使用的命令行是:

pyinstaller ^
     --paths="C:\Python27\Lib\site-packages" ^
     --hidden-import="C:\Python27\Lib\site-packages\netCDF4_utils.py" ^
    "C:\Users\...\Code\python\NCTSutil\NCTSU.spec"  

使用的规范文件是:

# -*- mode: python -*-
a = Analysis(['C:\Users\...\Code\python\NCTSutil\NCTSU.py'],
             pathex=['C:\Users\...\Code\python\NCTSutil'],
             hiddenimports=[],
             hookspath=['C:\Users\...\Code\python\NCTSutil\hooks'],
             runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='NCTSU.exe',
          debug=False,
          strip=None,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=None,
               upx=True,
               name='NCTSU')

最初,我只使用为 pubsub 模块指定的挂钩路径(我从网站上获得)构建了可安装程序。当我尝试 运行 运行可执行文件时,我收到了错误

"Import error: No module named netCDF4_utils" when executable is run 

我认为这是由于安装程序无法找到某些 NetCDF4 依赖项造成的。 (原包导入为"import netcdf4")。

为了尝试解决这个问题,我尝试在 运行ning pyinstaller 时在 SPEC 文件和命令行中指定隐藏的 netCDF4_utils 文件。 spec文件和命令行的变化以及相关的错误如下:

1) SPEC文件中指定了隐藏的path/file,命令行中也给出了路径。当可执行文件为 运行

时,这会导致错误 "Import error: No module named netCDF4_utils"

2) 隐藏的 path/file 是在命令行上指定的,而不是在规范文件中。这导致 'compilation' 错误 "AttributeError: 'NoneType' object has not attribute 'split'"

3)命令行指定了隐藏文件(但没有路径),命令行单独给出了路径(spec文件中没有给出隐藏文件)。当可执行文件为 运行 时,这会导致错误 "Import error: No module named netCDF4_utils" .

4) 隐藏文件(无路径)是在命令行(而不是在 spec 文件中)指定的,当可执行文件为 运行

时会导致错误 "Import error: No module named netCDF4_utils"

5) SPEC 文件中指定了隐藏文件,并在命令行中给出了该文件的路径。这给出了编译错误:"NameError: name 'netCDF_util' is not defined"

我没有尝试编写挂钩文件,因为我不知道如何编写它们。

如果有人对如何让 pyinstaller 找到依赖文件以便将它们包含在分发中有任何详细建议,我们将不胜感激。

这是在使用 python 2.7 和 pyinstaller 2.1

的 win7 机器上完成的

尝试:

  • 删除当前pyinstaller:pip uninstall pyinstaller

  • python3 分支 (https://github.com/pyinstaller/pyinstaller) 克隆并安装 pyinstaller

  • 将您的 .spec 文件从 hiddenimports = [] 修改为 hiddenimports = ['netCDF4.utils', 'netcdftime']

这对我有用。

  • 文件内部似乎有语法错误:hook-netCDF4.py
  • 此文件通常位于 python 文件夹内(根据您的 pyinstaller 版本):

    C:\Python27\Lib\site-packages\PyInstaller-3.4.dev0+3c87c135a-py2.7.egg\PyInstaller\hooks

  • 您必须使用文本编辑器打开文件,然后将“netCDF4_utils”中的“netCDF4.utils”更改为“netCDF4_utils

文件中正确的行应该是:

hiddenimports = ['netCDF4_utils', 'netcdftime']

这个解决方案对我解决了同样的问题很有效。