一、 幕一:工程拉下即崩溃?No module named 与 SSL 网络陷阱
小C:老A,快救场!我刚把咱们智能洗车机项目源码 main.py 拉到现场工控机上,用 PyCharm 打开一运行,控制台直接红成一片!
ModuleNotFoundError: No module named 'eel'
ModuleNotFoundError: No module named 'pyads'
Warning: Cannot find reference '_MEIPASS' in 'sys.pyi'
老A:哈哈,小C,别慌!咱们先把这几个报错分分类:
1. 静态警告 _MEIPASS:这是 PyInstaller 单文件打包时的动态属性。源码里用了 getattr(sys, 'frozen', False) 做了安全防护,直接跑源码时它只是静态语法提示警告,完全不影响程序运行。
2. 红字报错 No module named:说明你当前选中的 Python 环境里,还没安装 eel 和 pyads。
小C:懂了!那还不简单,我直接在命令行跑 pip install eel pyads 不就行了?……哎等等,怎么又抛一长串异常了?!
WARNING: Retrying after connection broken by 'SSLError(SSLEOFError...)'
Could not fetch URL https://pypi.org/simple/eel/: Max retries exceeded with url
ERROR: Could not find a version that satisfies the requirement eel
老A:工控机现场网络环境复杂,直接连官方 PyPI 常常会遇到 SSL 握手超时阻断。
此外,eel 依赖 gevent 和 greenlet,如果直接 pip 最新版,在没有安装 MSVC C++ 14.0 编译环境的工控机上还会触发源码编译失败!
💡 老A的第 1 个避坑卡片:镜像源 + 预编译轮子锁定
python -m pip install "greenlet<3.0.0" "gevent<24.0.0" pyads eel -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
二、 幕二:鬼打墙!明明 pip 成功了,PyCharm 为什么依然标红?
小C:老A,我在命令行运行 python -c "import eel; import pyads" 已经打印成功了,但为什么我的 PyCharm 编辑器里,import eel 依然挂着红线警告?
老A:小C,注意看你 PyCharm 编辑器最上方的那行黄色警告条!
⚠️ Invalid Python interpreter selected for the project
老A:这就是典型的“路径漂移导致的解释器失效”大坑!
这个洗车机工程最初是在 C:\car_washer240816 目录下创建的,后来项目整体复制或移动到了 F:\car_washer240816。
PyCharm 配置文件记录的依然是旧路径下的虚拟环境。因为 PyCharm 找不到那个失效的 Python 解释器,它彻底停止了对整个项目的包索引!
🛠️ 老A的第 2 个避坑卡片:30秒重置 PyCharm 解释器
- 点击编辑器顶部黄色的 Invalid Python interpreter selected for the project 警告
- 选择 Configure Python Interpreter...。
- 在下拉框中选择当前项目真实的虚拟环境路径:
F:\car_washer240816\venv\Scripts\python.exe。 - 点击 OK 保存,PyCharm 重新建立索引后,红色标红瞬间消失!
三、 幕三:暗礁密布!Windows 下 Python 3.8+ 找不到 TcAdsDll.dll
小C:标红都没了!我赶紧运行 main.py……啊?又报错了!
FileNotFoundError: Could not find module 'TcAdsDll.dll' (or one of its dependencies). Try using the full path with constructor syntax.
老A:这就是 **Python 3.8+ 在 Windows 平台上的一个重要底层机制变更**!
在 Python 3.8 之前,C-DLL 动态库会自动沿着系统的 PATH 环境变量去寻找;但从 Python 3.8 开始,出于安全考虑,ctypes.WinDLL 不再默认搜索 PATH。如果不显式使用 os.add_dll_directory() 注册 DLL 目录,Python 就会直接报 FileNotFoundError!
💡 老A的第 3 个避坑卡片:TwinCAT 动态库自动注册(写入 main.py 顶部)
# 自动注册 TwinCAT ADS DLL 动态库搜索路径(兼容 Python 3.8+ Windows)
if sys.platform == 'win32' and hasattr(os, 'add_dll_directory'):
for twincat_dll_path in [r'C:\TwinCAT\Common64', r'C:\TwinCAT\Common32']:
if os.path.exists(twincat_dll_path):
try:
os.add_dll_directory(twincat_dll_path)
except Exception:
pass
小C:再次运行,控制台终于打印出了:
ADS通讯端口已成功打开!
倍福 TwinCAT PLC 的 AMS NetID (5.59.43.40.1.1) 通讯彻底建联成功了!
四、 幕四:临门一脚!Chrome 崩溃与 WinError 14001 并行配置错误
小C:老A,PLC 通讯成功了,但是程序在最后弹出 Web HMI 界面时又卡崩了!
ADS通讯端口已成功打开
Traceback (most recent call last):
File "F:\car_washer240816\main.py", line 206, in <module>
eel.start('main.html', port=0)
File "C:\Python39\lib\subprocess.py", line 1420, in _execute_child
hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
OSError: [WinError 14001] 应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志...
老A:这是最后一关——浏览器进程唤起异常!
eel.start('main.html', port=0) 在没有指定 mode 参数时,默认会唤起系统的 Google Chrome 浏览器。
工控机上的 Chrome 浏览器因为版本陈旧或缺失对应的 Visual C++ SxS 运行时组件,导致 Windows 在执行 subprocess.Popen 调用 Chrome 时弹出了系统级的 WinError 14001 并行配置错误。
💡 老A的第 4 个避坑卡片:Eel 启动 Edge 模式与容错降级
# web初始化
plc_symbol_link()
eel.init('.')
try:
# 优先使用系统内置的 Edge 浏览器打开 Web 界面(避开 Chrome WinError 14001 并行配置错误)
eel.start('main.html', mode='edge', port=0)
except Exception as e:
print(f"Edge 模式启动提示: {e},尝试使用默认模式启动...")
eel.start('main.html', mode='default', port=0)
close_plc_port()
五、 幕五:完美收官与现场架构复盘
小C:老A,我修改完代码点击 Run——界面弹出来了!精美的洗车机 HMI 控制面板成功显示,PLC 的真实传感器数据、泵阀状态和水枪压力全部实时刷新了!
老A:太棒了!回顾一下,咱们今天这套 Python + Eel + TwinCAT ADS 架构 的优势非常明显:
• 前端灵活:基于现代 HTML5/CSS3/JS(Bootstrap、Eel.js),界面比传统工业组态屏炫酷得多。
• 底层强悍:利用 pyads 直接读写倍福 PLC 的符号变量(ADS 通讯周期毫秒级)。
• 避坑到位:处理好了国内 pip 镜像、PyCharm 路径绑定、Python 3.8+ Windows DLL 目录注册,以及 Edge 混合唤起模式。
📋 现场排坑 Checklist 卡片:
-
- 依赖安装:使用国内镜像 + 锁定
gevent<24.0.0 避开 C++ 编译陷阱。 -
- IDE 配置:检查 PyCharm 顶部黄色警告条,确保 Interpreter 路径匹配当前目录。
-
- ADS 通讯:
import pyads 前务必调用 os.add_dll_directory(r'C:\TwinCAT\Common64') 注册 DLL 路径。 -
- Eel Web 模式:优先指定
mode='edge',避免工控机 Chrome 环境缺失引发 WinError 14001。 -
- 代码容错:在
plc.open() 和配置文件 read_file() 处增加 try...except 保护。 -
本文由老A与小C联合原创整理 · 工业自动化与 Python 跨界开发实战系列