无法将scikit-learn导入NX Open API



我正试图将sklearn.cluster和scipy.spatial导入一个名为NX的三维CAD/CAM建模程序中。

我用Anaconda为Python 3.3.2创建了一个虚拟环境(conda-create-npy33),并通过conda安装了sklearn。我在英特尔64位计算机上使用Windows7。在大多数情况下,我已经能够成功地使用numpy方法和属性,尽管有些(np.array_equiv)会锁定NX。

当我用import sklearn.cluster运行一个python文件时,它会使NX崩溃。我还没有使用任何sklearn类或方法。单独的import线路将使NX崩溃。import scipy.spatial也面临类似的问题。我没有使用任何scipy.spatial方法或类。

根据文档,将注释#nx:threaded放在python文件的最顶部应该可以解决问题,但事实并非如此。

据我所知,Python 3.2+有一个新的GIL实现。将线程扩展模块导入NX可能会有问题,因为下面的文档说明了

https://docs.plm.automation.siemens.com/tdoc/nx/10.0.3/release_notes/#uid:xid385122

使用Python运行线程扩展模块NX中的嵌入式Python解释器使用子解释器线程运行Python脚本,以隔离同时运行的不同脚本的执行环境。例如,您可以使用启动脚本,利用用户出口,并在会话中显式运行日志。在一个单独的子企业中运行这些脚本中的每一个都会使这些环境彼此分离,以避免可能的非法访问和冲突。然而,这种方法也有一些缺点。有一些第三方扩展模块(非NXOpen扩展模块,如matplotlib)使用C线程执行操作。这些扩展模块可以安全地导入,但当调用启动C线程的函数时,子企业会挂起或崩溃。这些扩展仅在主解释器线程中安全运行。不幸的是,Python没有提供在子企业线程中运行此类扩展模块的安全方法,也没有提供在脚本已经执行时从子企业线程切换到主解释器线程的任何方法

要支持这样的线程扩展模块,NX必须在准备解释器之前知道Python脚本是否正在使用这些模块中的任何一个。因此,如果脚本正在使用这些类型的线程扩展模块,或者直接或间接导入正在使用线程扩展模块的模块,则应在前三行的任何位置添加一条注释,其文本为nx:threaded。例如:

# nx:threaded
# some comments nx:threaded some comments
# some comments
# nx:threaded
# some comments

这指示NX准备其嵌入式Python解释器,以便在主线程而不是子线程中运行脚本,以避免可能出现的问题。纯Python线程在子企业中没有这些问题,应该在没有额外注释的情况下使用。该注释可以添加到任何Python脚本中,无论是启动脚本、用户退出脚本还是普通日志。不要不必要地使用此注释。它在主解释器线程中运行所有脚本,并可能表现出一些异常行为,例如非法数据访问和对象释放。只有在导入和使用线程扩展模块时才使用此注释

尝试#nx:线程化令牌。某些扩展模块可能会在导入时启动本机线程。不知怎的,sklearn.cluster导入正在干扰或修改嵌入子企业状态的数据。同样的问题也可以在numpy中看到。文档可能不是100%正确。我认为添加"nx:线程化"令牌应该可以解决您的问题。

相关内容

  • 没有找到相关文章