Scikit-learn Multicore: "AttributeError: StdIn instance has no attribute 'close'"



我正在使用PyCharm从Scikit-learn运行RandomForestRegressor。当执行整个脚本时,这工作得很好:

clf = ensemble.RandomForestClassifier(n_estimators=100, n_jobs = 4, verbose=1, oob_score=True)
clf = clf.fit(x_train, y_train)

当我尝试从控制台中运行这行时,我反复得到这个错误:

AttributeError: StdIn instance has no attribute 'close'
  File "/usr/local/Cellar/python/2.7.6_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 249, in _bootstrap
    sys.stdin.close()

如果我将n_jobs参数更改为n_jobs=1,我不会得到错误,但它不能利用多线程。

我假设这与PyCharm控制台重定向stdin的事实有关,但我不确定如何让它工作。任何想法都很感激-谢谢!

我来得有点晚,但我刚才也遇到了同样的问题。

在另一个答案中建议的解决方案是避免PyCharm的交互式解释器。当然,这可以工作,但不能使我满意,因为我非常喜欢使用交互式解释器。

我发现了一个不同的解决方法允许使用交互式解释器的问题。在通过multiprocessing.Process()创建每个新进程之前,必须应用以下代码片段:

if not hasattr(sys.stdin, 'close'):
    def dummy_close():
        pass
    sys.stdin.close = dummy_close

现在,multiprocessing可以在sys.stdin上调用close(),一切都很顺利。

请注意,在启动阶段连接一次虚拟close()是不够的。我发现有必要在每次调用multiprocessing.Process()之前这样做;但是,我没有尝试使用进程池。

由于PyCharm主要是一个IDE,它支持快速的源代码文本输入,自我反省,原型设计和调试工作。

作为一个经验法则,验证你的{硬件| VM}能力并行工作:

import multiprocessing
multiprocessing.cpu_count()

在PyCharm IDE内并行多处理

不要浪费cpu时间在任何IDE中运行已经调优的代码,无论是在IDE集成的python引擎上还是在IDE远程python引擎上(PyScripter IDE等的已知情况)。

在像 C:Python2.7python.exe aRandomForestJOB.py 这样的普通命令行中,良好的python代码将运行得更安全、更快。

如果PyCharm控制台仍然阻塞您的多处理路径,尝试在独立的python解释器中运行相同的代码以重新生成问题并发布事后分析消息,如果您的代码在那里崩溃。

PyCharm sys.stdin.close()错误解决方法

Nathan Lemoine报道:

"PyCharm 3包含一个本地终端。我在那个终端中打开python,它运行得很好,这允许我进行调试和交互工作。这让我觉得这是PyCharm运行其交互式解释器的特定方式的问题。但由于解决方法很简单,所以这不是问题。"

为了让像我这样的python新手更容易理解,我从之前的回答和评论中总结了一个解决方案。打开process.py,在我的Linux系统上是这样做的:

sudo gedit /usr/lib/python2.7/multiprocessing/process.py

在更改之前,我会备份它,以便在出现问题时轻松恢复。然后在process.py中找到"bootstrap",并将其改为如下开头:

def _bootstrap(self):
    from . import util
    global _current_process
    if not hasattr(sys.stdin, 'close'):
        def dummy_close():
            pass
        sys.stdin.close = dummy_close
    try:

相关内容

  • 没有找到相关文章

最新更新