将 statsmodels 与 pyinstaller 一起使用时出错
Error when using statsmodels with pyinstaller
我在使用 PyInstaller 和 statsmodels
时遇到问题。当我 运行 可执行文件出现错误 ImportError: No module named 'statsmodels.__init__.tools'
时,当我 运行 直接使用 Python 代码时一切正常。
我试过了this solution.
它适用于 tools
模块,但我收到另一个错误:
我尝试添加 statsmodels
、statsmodels.__init__
和 statsmodels.__init__._version
,但也没有用。
statsmodels
是 PyInstaller 的复杂模块之一,这是因为它依赖于一些其他模块,它们会弄乱 PyInstaller 导入图。我的解决方案可能看起来没有优化,但可以完成工作。
hidden-imports
只会告诉 PyInstaller 查找该模块,但有时它无法跟踪模块依赖项(如 DLL、外部 py 文件等)。所以对于 statsmodels
没有帮助。
整个过程是首先告诉 PyInstaller 不要用 exclude-module
跟踪 statsmodels
并将模块手动提供给最终的可执行文件。
此外,我们需要捆绑一些模块,如 (numpy
、pandas
等) 和 Tree
class.
我正在使用 Python 3.7.4 和最新的 PyInstaller 3.5。
假设下面的例子取自 official docs.
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
dat = sm.datasets.get_rdataset("Guerry", "HistData").data
results = smf.ols('Lottery ~ Literacy + np.log(Pop1831)', data=dat).fit()
print(results.summary())
使用下面的规范文件(我在脚本旁边使用 Python 的 venv,称为 env
)
# -*- mode: python -*-
block_cipher = None
a = Analysis(['script.py'],
pathex=['<root_project_path>'],
binaries=[],
datas=[],
hiddenimports=['six', 'fractions', 'csv', 'pytz', 'timeit'],
hookspath=[],
runtime_hooks=[],
excludes=['statsmodels'],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
a.datas += Tree("./env/Lib/site-packages/statsmodels", prefix="statsmodels")
a.datas += Tree("./env/Lib/site-packages/numpy", prefix="numpy")
a.datas += Tree("./env/Lib/site-packages/pandas", prefix="pandas")
a.datas += Tree("./env/Lib/site-packages/scipy", prefix="scipy")
a.datas += Tree("./env/Lib/site-packages/dateutil", prefix="dateutil")
a.datas += Tree("./env/Lib/site-packages/patsy", prefix="patsy")
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='script',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=False,
runtime_tmpdir=None,
console=True )
最后生成你的可执行文件:
pyinstaller script.spec
我在使用 PyInstaller 和 statsmodels
时遇到问题。当我 运行 可执行文件出现错误 ImportError: No module named 'statsmodels.__init__.tools'
时,当我 运行 直接使用 Python 代码时一切正常。
我试过了this solution.
它适用于 tools
模块,但我收到另一个错误:
我尝试添加 statsmodels
、statsmodels.__init__
和 statsmodels.__init__._version
,但也没有用。
statsmodels
是 PyInstaller 的复杂模块之一,这是因为它依赖于一些其他模块,它们会弄乱 PyInstaller 导入图。我的解决方案可能看起来没有优化,但可以完成工作。
hidden-imports
只会告诉 PyInstaller 查找该模块,但有时它无法跟踪模块依赖项(如 DLL、外部 py 文件等)。所以对于 statsmodels
没有帮助。
整个过程是首先告诉 PyInstaller 不要用 exclude-module
跟踪 statsmodels
并将模块手动提供给最终的可执行文件。
此外,我们需要捆绑一些模块,如 (numpy
、pandas
等) 和 Tree
class.
我正在使用 Python 3.7.4 和最新的 PyInstaller 3.5。 假设下面的例子取自 official docs.
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
dat = sm.datasets.get_rdataset("Guerry", "HistData").data
results = smf.ols('Lottery ~ Literacy + np.log(Pop1831)', data=dat).fit()
print(results.summary())
使用下面的规范文件(我在脚本旁边使用 Python 的 venv,称为 env
)
# -*- mode: python -*-
block_cipher = None
a = Analysis(['script.py'],
pathex=['<root_project_path>'],
binaries=[],
datas=[],
hiddenimports=['six', 'fractions', 'csv', 'pytz', 'timeit'],
hookspath=[],
runtime_hooks=[],
excludes=['statsmodels'],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
a.datas += Tree("./env/Lib/site-packages/statsmodels", prefix="statsmodels")
a.datas += Tree("./env/Lib/site-packages/numpy", prefix="numpy")
a.datas += Tree("./env/Lib/site-packages/pandas", prefix="pandas")
a.datas += Tree("./env/Lib/site-packages/scipy", prefix="scipy")
a.datas += Tree("./env/Lib/site-packages/dateutil", prefix="dateutil")
a.datas += Tree("./env/Lib/site-packages/patsy", prefix="patsy")
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='script',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=False,
runtime_tmpdir=None,
console=True )
最后生成你的可执行文件:
pyinstaller script.spec