一尘不染

PyInstaller,规范文件,ImportError:没有名为“ blah”的模块

mysql

我正在尝试通过PyInstaller构建python脚本。我使用以下命令来配置,生成规格文件并进行构建:

wget pyinstaller.zip, extracted it, python Configure.py, etc, then:

python pyinstaller/Makespec.py --onefile myscript.py
python pyinstaller/Build.py myscript.spec

这是它生成的规格文件:

# -*- mode: python -*-
a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), 'icinga.py'],
             pathex=['/home/user/projects/icinga_python/releases/v2.1'])
pyz = PYZ(a.pure)
exe = EXE( pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name=os.path.join('dist', 'myscript'),
          debug=False,
          strip=False,
          upx=True,
          console=1 )

这在dist/目录中构建了一个可执行文件。尝试运行此文件时,得到以下信息:

Traceback (most recent call last):
  File "<string>", line 12, in <module>
  File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 455, in importHook
    raise ImportError, "No module named %s" % fqname
ImportError: No module named mysql

如果我将此可执行文件移到实际Python代码的目录中,则会得到不同的结果:

Traceback (most recent call last):
  File "<string>", line 12, in <module>
  File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 436, in importHook
    mod = _self_doimport(nm, ctx, fqname)
  File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 521, in doimport
    exec co in mod.__dict__
  File "CLUSTER/mysql/icingasql.py", line 13, in <module>
    import urllib2
  File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 455, in importHook
    raise ImportError, "No module named %s" % fqname
ImportError: No module named urllib2

在…
pyinstaller文档中,我看到这--onefile是我需要/想要的选项,但是由于某种原因,并不是所有内容都被编译进来了。

该脚本实际上并没有包含任何花哨的内容,只是我为sql语句编写的一些快速模块,以及解析某些网站的脚本。


阅读 327

收藏
2020-05-17

共1个答案

一尘不染

当您的代码中有动态导入时,可能会发生此错误。在这种情况下,pyinstaller不在exe文件中包含这些软件包。在这种情况下,您可以:

  1. 在代码中添加未使用的那些软件包的导入
  2. 告诉pyinstaller包含它

一个文件选项不会在运行代码时更改任何内容。如果创建–onefile
exe,则由pyinstaller创建的所有文件都打包为exe文件,并在每次运行exe时解压缩为本地temp。

2020-05-17