Python程序打包经常会用到Pyinstaller这个工具,打包成一个独立的exe程序用于发布,这样就不用在目标机上部署Python的一整套环境,但笔者在测试的时候发现,写一个测试程序,打包后无故障运行,但一旦用了pymssql这个包,也就是要连SQL server的时候,就出问题了,打包可以成功,但程序就是无法运行,会报错,ImportError: No module named _mssql,可以定位到问题就出在pymssql这个包上,注释掉数据库连接就OK了,在百度了一番之后,找到一个解决方案:
https://blog.csdn.net/m0_37509180/article/details/72576177
方案的来源是一个老外写的一段话:
Just as a suggestion, put an import decimal at the top of your program. It looks like _mssql might be doing dynamic imports in __load method which will "confuse" py2exe because it can't know about dynamic imports which happen at runtime.
大意就是打包的时候,打包程序无法判断动态调用,_mssql是动态调用的,就是用才调用,不会一开始就调用,于是打包程序就不知道要不要包进exe里面,估计打包的时候不会去尝试运行pymssql里面的函数,因此也无法得知动态调用的模块,于是乎,老外给的解决方案就是在程序最开始手动调用,为了最小的程序开销,调用一下模块的版本信息就可以了,就如下面几句代码,程序直接调用,Pyinstaller或者py2exe就会把这些模块都放到包里去了,这样在运行exe的时候就不会提示缺模块了。
import _mssql import decimal import uuid _mssql.__version__ decimal.__version__ uuid.ctypes.__version__