用Python Embeddable打包分发程序找不到模块

背景

工作中帮同事写个数据处理的Python脚本,为了方便交互还用tkinter写了个简单的界面

用Python Embeddable打包分发程序找不到模块_第1张图片

但同事数据采集的电脑上没有python环境,之前一直用pyinstaller打包成可执行文件,后面每次调整都要重新打包,比较麻烦

搜索后发现可以使用嵌入版的python解决环境问题,

主要操作可以参考 使用Python embeddable package 版(嵌入式、绿色版)分发自己的python程序 - 简书 (jianshu.com)

使用过程中遇到两个坑

1、Embeddable-python默认没有tkinter,因此 找不到thinker模块,pip安装也不成功

用Python Embeddable打包分发程序找不到模块_第2张图片

 2、导入同目录下自己写的模块,显示找不到模块

 解决办法

1、解决Embeddable-python默认没有tkinter

参考:(1条消息) embeddable python 安装pip和tkinter_法律人学python的博客-CSDN博客_pip下载tkinter

解决办法:

1)从一个正常的、相同版本(大版本相同即可)的python中去找tkinter的程序包,把正常python安装目录的tcl 文件夹(正常python的python.exe同级)复制到 embedded_python(嵌入版本的解压根目录)。
2)将tkinter 文件夹 (正常python的 Lib文件夹下) 复制到embedded_python的Lib\site-packages目录下
3)把文件 _tkinter.pyd tcl86t.dll tk86t.dll (正常python的 DLLs文件夹下)复制到 embedded_python\(嵌入版本的解压根目录)

2、解决导入自定义模块,找不到自定义模块

 参考:咸鱼先锋 - 优雅而方便的用Python Embeddable打包程序 (xyuxf.com)

 直接说结论:嵌入式版不受环境变量的影响,安装版和嵌入式版本在加载依赖的方式上会有些差别

解决办法思路--》将文件夹加入到依赖包的扫描路径列表中

一种方法是在代码前将其加入扫描路径

用Python Embeddable打包分发程序找不到模块_第3张图片

想不修改项目代码解决这个问题,则可以将增加扫描路径添加到环境配置文件中

在嵌入式版“Lib\site-packages”下新建一个文件,以“.pth”为扩展名,输入以下内容并保存:

import sys
import os
sys.path.insert(0,os.path.dirname(sys.argv[0]))


例如这里命名为了“start_path.pth”

用Python Embeddable打包分发程序找不到模块_第4张图片

放入这个文件后,嵌入式版本的Python启动并扫描依赖包路径时,会执行到这个文件。而这段代码又把入口文件所在的目录加入了依赖查找的路径中,就不会出现上面无法导入模块的报错了。
 

在此打开bat命令,就可以正常启动了

你可能感兴趣的:(python应用,python,开发语言)