由于项目需要将python脚本打包到dos窗口中直接运行,这里我选择了使用pyinstaller进行打包
问题一、在if __name__ == '__main__':下加入input语句后打包报错
一般打包我会使用:
pyinstaller -D -w ***.py
这里需要注意在使用了input语句后是不能加入-w选项的,这样会使得input语句无法启用。
问题二、为了将源码加密便利用Cpython将其转化为pyd文件,进而将pyd文件打包
这里所用.py文件如下:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize("find_ball.py"))
这里的转化语句如下:
python setup.py build_ext --inplace
这里有一个大坑!!!
作为自定义的包的命名决不能是“test.py”,如果是的话就会导致在打包后无法导入自定义的函数,这个个人推测是应该是有test的相关库存在,在打包时优先选择那个库而非自定义的包,因此使得无法使用自定义库“test.py”里的函数。虽然在VSCDOE里是能够编译的但在打包后是不行的!
在转化为pyd文件进行打包的注意事项
1、在将py文件转化为pyd文件之前将每个.py文件用到的包(也不是全部,但是如open3d、cv2都尽量加入)在入口.py文件中import输入,这样是避免有用到的库没有被加入。
2、在转化为.pyd文件后,在入口.py文件中导入如下(比如原本find_ball.py转化后导入,即使仅仅用到里面的几个函数也最好加上和下面类似的语句,保证不会出错):
import find_ball
因为打包只会加入入口文件导入的库\包,这一点谨记。
3、在将py文件转化为pyd文件时千万注意函数名不要和文件名一样,由于2中要再次导入库名(也就是不包括后缀的文件名),会产生如下错误:
TypeError: 'module' object is not callable
问题三:打包加载额外资源
因为每次打包软件时都会有一些其他的资源比如图标、模型文件等等需要加入打包后的文件夹下,而语句如下:
pyinstaller -D -w entrance.py --add-data="./template_cnt_.npy;." --add-data="./data_bk;./data_bk" --add-data="./result;./result" --add-data="./data_pcd;./data_pcd" --add-data="./logo.ico;."
上述代码分别将两个文件以及两个文件夹加入到软件对应的文件夹下。(注意要用英文路径下双引号)