无法导入scikit-learn到NX Open API

时间:2016-05-05 18:33:16

标签: multithreading scikit-learn

我正在尝试将sklearn.cluster和scipy.spatial导入到名为NX的3D CAD / CAM建模程序中。

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

当我使用import sklearn.cluster运行python文件时,它将崩溃NX。我还没有使用任何sklearn类或方法。仅import行就会崩溃NX。我还面临与import scipy.spatial类似的问题。我没有使用任何scipy.spatial方法或类。

根据文档,在python文件的最顶部放置注释#nx:threaded应该可以解决问题,但它没有。

据我所知,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脚本中。 不要不必要地使用此评论。它运行主解释器线程中的所有脚本,并可能表现出一些异常行为,例如非法数据访问和对象释放。仅在导入和使用线程扩展模块时使用此注释。

1 个答案:

答案 0 :(得分:1)

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