与windows一样,我用pyinstaller进行程序打包,只是ubuntu下的命令更为严谨,大小写都会导致出错,在终端导入pyinstaller后,即可进行程序打包。
首先生成spec : pyi-makespec -w demotest.py, 就会先生成 test.spec(当前目录下)
#-*- mode: python ; coding: utf-8 -*-
block_cipher= None
= Analysis(['demotest.py'],
pathex=['/home/shuo/SSD_Tensorflow_master'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz= PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe= EXE(pyz,a.scripts, [],
exclude_binaries=True,
name='demotest',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll= COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='demotest')
然后进行打包
打包完成后,在文件界面打开终端输入./demotest,即可执行
出现以下错误:
错误1:
ImportError:Unable to import required dependencies: numpy: No module named 'numpy.random.common'
解决方法:
(1)找到numpy,将整个包全部覆盖到打包文件夹,问题解决
(2)由于numpy是我用pycharm装的,所以为了排除这个问题,我在pycharm中卸载了这个包,然后通过终端重新安装,安装结束后还是报错,然后在网上查找问题,后来发现可能是版本有问题,参考链接如下:,https://stackoverflow.com/questions/57264427/in-pyinstaller-why-wont-numpy-random-common-load-as-a-module, 于是按照上述方法,降级后,问题解决。
错误2:
tensorflow.python.framework.errors_impl.NotFoundError: tensorflow/contrib/util/tensorflow/contrib/rnn/python/ops/_gru_ops.so: cannot open shared object file: No such file or directory
解决方法:
(1)参考了以下博客:,https://codeday.me/bug/20190710/1427030.html, 试着改调用的程序,操作一波后,这个不在报错,但是报另外一个os丢失的错误,于是这种方法果断放弃。
(2)由于这个问题属于系统调用问题,回想起之前自己电脑出问题的时候,无论怎么装插件,怎么改策略组都是于是无补的时候,这是重装系统是一个好的选择,方便快捷。于是我就将tensorflow果断升级到最新版本,最后接着生成在运行,可是结果却并不好,出现另一个os报错,最新版本不行,于是我就降级,降级也不需要什么特殊指令,也不需要删除旧版本,直接“pip install tensorflow==你需要的版本”,在终端运行后,会开始下载相应的版本,由于网络问题,国外有可能网速慢,所以下载失败后再来一次,实在不行多下几次就好,这个安装完毕后,系统会自动卸载之前的版本。我试了三次,因为我的windows里面的就是1.4,从1.4-1.6一个一个试,最终确定1.6。可能有人会问,tensorflow不是既有CPU版本又有gpu版本吗,万一下载成了gpu的咋办,毕竟是虚拟机调用不了GPU,我们可以去清华大学镜像源里面找,这里附上链接:https://mirrors.tuna.tsinghua.edu.cn/tensorflow/linux/cpu/, 我用的是tensorflow-1.6.0rc0-CP36-cp36m-linux_x86_64.whl,这里面cp36代表python3.6,因为tensorflow要和python对应,版本不对应,是会报错的。进过一波操作后,运行报错:AttributeError: module ‘enum’ has no
attribute ‘IntFlag’,后来发现只要卸载那个包就行,因为它和python里面的包冲突了。然后接着运行,虽然报错,但是这个报错让我看到了希望,因为报错的是我的打包文件夹的路径,这个路径只要缺东西,那我们找到相应的包,往里面塞就行。
经过操作后,努力果然没有白费,终于可以运行了。
附上截图: