明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1998|回复: 15

python连接CAD报错,COMError: (-2147352567, '发生意外。', ('未找到文件', 'Auto...

[复制链接]
发表于 2023-2-8 10:14:11 | 显示全部楼层 |阅读模式
python连接CAD报错:
使用多线程同时调用COM接口绘图,偶尔会提示以下错误,
_ctypes.COMError: (-2147352567, '发生意外。', ('未找到文件', 'AutoCAD.Application', 'C:\\Program Files\\Autodesk\\AutoCAD 2016\\HELP\\OLE_ERR.CHM', -2145386422, None)
貌似跟电脑性能有关,感觉是同时调用的时候,电脑处理不过来,接口被占用,报的错,有没有人遇到这种情况,应该怎么解决。
发表于 2023-4-7 10:16:51 | 显示全部楼层
不太明白,我因为只用了pyautocad,稍微了解些win32com,感觉您用的都不是这两个库?
然后我用AI搜了下,您要不试试?
这个错误一般是由于AutoCAD应用程序对象被多个线程同时调用,导致访问冲突而发生的。在使用Python连接AutoCAD时,由于Python的全局解释器锁(GIL)的存在,Python默认只能单线程运行。因此,你需要使用Python的多线程库threading来创建新线程,并确保每个线程都使用独立的AutoCAD应用程序对象。

下面是一个使用多线程连接AutoCAD的示例代码:
import clr
clr.AddReference("AcMgd")
clr.AddReference("AcCoreMgd")
from Autodesk.AutoCAD.Interop import AcApplication
from Autodesk.AutoCAD.Interop.Common import AcadApplication, AcadDocument
import threading

def create_autocad_app():
    acad = AcApplication.AcadApplication()
    return acad

def draw_line(acad):
    doc = acad.ActiveDocument
    model_space = doc.ModelSpace
    line = model_space.AddLine((0, 0, 0), (10, 10, 0))
    doc.Save()

if __name__ == "__main__":
    num_threads = 5 #设置线程数
    threads = []
    for i in range(num_threads):
        t = threading.Thread(target=draw_line, args=(create_autocad_app(),))
        threads.append(t)

    for t in threads:
        t.start()

    for t in threads:
        t.join()

上述代码中,create_autocad_app()函数用于创建一个新的AutoCAD应用程序对象,draw_line(acad)函数用于在给定的AutoCAD应用程序对象中绘制一条直线。num_threads变量定义要创建的线程数,并使用threading.Thread创建指定数量的线程。在每个线程中调用create_autocad_app()创建一个独立的AutoCAD应用程序对象,并调用draw_line(acad)在其中绘制一条直线。t.join()用于等待所有线程执行完毕。

这样,在多线程环境下调用COM接口绘图时,就能避免访问冲突,从而解决上述错误。
发表于 2023-2-8 11:14:07 | 显示全部楼层
w8826543 发表于 2023-2-8 11:07
lisp 调用py和exe是一样的吗? 主要是程序打包到其他电脑,py运行不了

具体怎么实现我没研究过,这个对我来说还是比较难的,只是有这么个方法,如果你需要处理较大量的数据,py不是理想选择。你论坛上去翻翻帖子,有讨论的,我能力有限,解决不了问题。
发表于 2023-2-8 12:13:44 | 显示全部楼层
w8826543 发表于 2023-2-8 11:00
pycad会更快吗?加个好友有空一起研究啊

Pycad因为用的是ironpython,所以很多外部的Python库不能用,比如 Numpy,scipy等
但是 接口用的.Net,所以 肯定是更稳定的
但是 现在Pycad的开发团队也不更新这一块了,有点失望,论坛都是劝 直接用C#的。。。
发表于 2023-2-8 10:42:01 | 显示全部楼层
这个 我也经常碰到,有人说是调用的太快,要加sleep,这个com的接口太不稳定了。
现在想转到 Pycad (ironpython),飞狐大佬做的集成。
也还是不太熟悉,python对 cad的开发 确实难啊
发表于 2023-2-8 10:50:16 | 显示全部楼层
muzilier 发表于 2023-2-8 10:42
这个 我也经常碰到,有人说是调用的太快,要加sleep,这个com的接口太不稳定了。
现在想转到 Pycad (iron ...

是这个问题,如果连接后要马上运行指令,最好连接的时候加个sleep。
 楼主| 发表于 2023-2-8 10:59:24 | 显示全部楼层
超超超人1670 发表于 2023-2-8 10:50
是这个问题,如果连接后要马上运行指令,最好连接的时候加个sleep。

主要是数据较多,10000多条数据,每条sleep 0.5 我也等不及啊
 楼主| 发表于 2023-2-8 11:00:36 | 显示全部楼层
muzilier 发表于 2023-2-8 10:42
这个 我也经常碰到,有人说是调用的太快,要加sleep,这个com的接口太不稳定了。
现在想转到 Pycad (iron ...

pycad会更快吗?加个好友有空一起研究啊
发表于 2023-2-8 11:05:00 | 显示全部楼层
w8826543 发表于 2023-2-8 10:59
主要是数据较多,10000多条数据,每条sleep 0.5 我也等不及啊

你可以试试看多少条以内不用sleep,sleep多少,这个com接口天生的没办法。要不然你试试论坛上有人说过的方法,用lsp调用py
 楼主| 发表于 2023-2-8 11:07:05 | 显示全部楼层
超超超人1670 发表于 2023-2-8 11:05
你可以试试看多少条以内不用sleep,sleep多少,这个com接口天生的没办法。要不然你试试论坛上有人说过的 ...

lisp 调用py和exe是一样的吗? 主要是程序打包到其他电脑,py运行不了
 楼主| 发表于 2023-2-8 11:17:54 | 显示全部楼层
超超超人1670 发表于 2023-2-8 11:14
具体怎么实现我没研究过,这个对我来说还是比较难的,只是有这么个方法,如果你需要处理较大量的数据,py ...

嗯,单线程不会报错,多线程才会偶尔报错,只能单线程耗时间慢慢跑了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-17 21:52 , Processed in 0.219113 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表