我正在尝试使用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机器上完成的答案 0 :(得分:0)
尝试:
删除当前的pyinstaller
:pip 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']
这个解决方案可以解决同样的问题。