【问题标题】:problems building python distribion containing netcdf4构建包含netcdf4的python发行版的问题
【发布时间】:2017-10-01 01:28:07
【问题描述】:

我正在尝试使用 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) 隐藏路径/文件是在命令行中指定的,但不是在规范文件中。这导致'编译'错误“AttributeError:'NoneType'对象没有属性'split'”

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

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

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

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

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

这是在使用 python 2.7 和 pyinstaller 2.1 的 win7 机器上完成的

【问题讨论】:

    标签: python pyinstaller netcdf


    【解决方案1】:
    • 文件里面好像有语法错误:hook-netCDF4.py
    • 此文件通常位于 python 文件夹内(根据您的 pyinstaller 版本):

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

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

    文件内正确的行应该是:

    hiddenimports = ['netCDF4_utils', 'netcdftime']
    

    这个解决方案为我解决了同样的问题。

    【讨论】:

      【解决方案2】:

      尝试:

      • 删除当前的pyinstallerpip uninstall pyinstaller

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

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

      这对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-31
        • 2020-04-24
        • 2016-03-24
        • 2020-11-24
        • 2021-11-01
        • 2010-10-25
        • 2018-07-02
        • 2011-02-24
        相关资源
        最近更新 更多