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

时间:2015-03-15 23:41:34

标签: python pyinstaller netcdf

我正在尝试使用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"  

使用的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”)。

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

1)隐藏路径/文件在SPEC文件中指定,并且路径也在命令行中给出。这导致运行可执行文件时出现错误“导入错误:没有名为netCDF4_utils的模块”

2)隐藏的路径/文件是在命令行中指定的,而不是在spec文件中指定的。这导致'编译'错误“AttributeError:'NoneType'对象没有属性'split'”

3)在命令行中指定了隐藏文件(但没有路径),并且在命令行上单独给出了路径(隐藏文件未在spec文件中给出)。运行可执行文件时,会导致错误“导入错误:没有名为netCDF4_utils的模块”      。

4)在命令行上(而不是在spec文件中)指定了隐藏文件(没有路径),这导致在运行可执行文件时出现错误“导入错误:没有名为netCDF4_utils的模块”

5)隐藏文件在SPEC文件中指定,文件路径在命令行中给出。这给出了一个编译错误:“NameError:name'netCDF_util'未定义”

我没有尝试编写一个钩子文件,因为我无法弄清楚如何编写它们。

如果有人有任何关于如何让pyinstaller查找依赖文件的详细建议,以便它们可以包含在分发中,我们将非常感激。

这是在使用python 2.7和pyinstaller 2.1

的win7机器上完成的

2 个答案:

答案 0 :(得分:0)

尝试:

  • 删除当前的pyinstallerpip uninstall pyinstaller

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

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

这对我有用。

答案 1 :(得分:0)

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

      

    C:\ Python27 \ LIB \站点包\ PyInstaller-3.4.dev0 + 3c87c135a-py2.7.egg \ PyInstaller \钩

  • 您必须使用文本编辑器打开文件并更改" netCDF4.utils"在" netCDF4_utils"

文件中的正确行应为:

hiddenimports = ['netCDF4_utils', 'netcdftime']

这个解决方案可以解决同样的问题。