Python3.6下tkinter转exe后paramiko SSH功能失效求助
我用cx_Freeze把Python3.6环境里的tkinter程序打包成exe后,原本正常的paramiko SSH连接功能失效了。已经在setup.py里引入了paramiko和socket包,但未打包的程序能正常运行,求解决思路。
附上我的setup.py代码:
import cx_Freeze from cx_Freeze import setup, Executable import os import sys includes = [] include_files = ["C:\\Python36-32\\DLLs\\tcl86t.dll", "C:\\Python36-32\\DLLs\\tk86t.dll", "C:\\Gustavo\\PyCharmPortable\\new\\cpass.ico", "C:\\Gustavo\\PyCharmPortable\\new\\py2.py", "C:\\Gustavo\\PyCharmPortable\\new\\py3.py", "C:\\Gustavo\\PyCharmPortable\\new\\tn.py", "C:\\Gustavo\\PyCharmPortable\\new\\file1.csv"] PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__)) os.environ['TCL_LIBRARY'] = "C:\\Python36-32\\tcl\\tcl8.6" os.environ['TK_LIBRARY'] = "C:\\Python36-32\\tcl\\tk8.6" base = 'Win32GUI' if sys.platform == 'win32' else None setup(name='Password Change', version='0.1', description='Password Change', options={"build_exe": {"packages": ["tkinter","paramiko","PIL","socket","telnetlib"], "includes": includes, "include_files": include_files}}, executables=[Executable('cp.py', base=base)])
我帮你整理几个针对性的排查和解决步骤,你可以一步步尝试:
先搞定报错信息可视化:你现在用了
base='Win32GUI',打包后的exe运行时没有控制台窗口,根本看不到具体的错误提示(比如缺了哪个模块、哪个DLL)。先把base改成None,重新打包运行,看看控制台里的具体报错,这能帮你精准定位问题。补充paramiko的隐式依赖包:cx_Freeze有时候没法自动识别paramiko的深层依赖,比如
cryptography、bcrypt、pynacl这些核心依赖库。你可以在setup.py的packages里把这些都加上,同时在includes里补充paramiko的核心模块,修改后的参数大概是这样:includes = ["paramiko.transport", "paramiko.client", "cryptography.hazmat.backends.openssl"] packages = ["tkinter","paramiko","PIL","socket","telnetlib", "cryptography", "bcrypt", "pynacl"]手动添加cryptography的必要文件:如果还是不行,找到你Python3.6安装目录下的
Lib\site-packages\cryptography文件夹,把整个文件夹复制到打包后的build\exe.win32-3.6目录里,或者在include_files里明确指定复制这个文件夹。检查OpenSSL相关DLL:paramiko底层依赖OpenSSL的动态链接库,打包后可能漏掉了。你可以去Python的DLLs目录或者系统的System32目录,找到
libcrypto-1_1.dll和libssl-1_1.dll,把它们复制到打包后的exe同级目录里试试。升级cx_Freeze版本:Python3.6对应的老版本cx_Freeze对复杂库的支持可能有bug,你可以升级到适合3.6的稳定版本(比如cx_Freeze 5.1.1),重新打包测试。
内容的提问来源于stack exchange,提问作者Gustavo

