Scikit-learn Multicore:“AttributeError:StdIn实例没有属性'close'”

时间:2014-06-11 20:11:10

标签: python scikit-learn pycharm

我正在使用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的事实有关,但我不确定如何让它工作。任何想法都表示赞赏 - 谢谢!

3 个答案:

答案 0 :(得分:6)

参加派对有点晚了,但我刚才遇到了同样的问题。

另一个答案中建议的解决方法是避免使用PyCharm的交互式解释器。当然,这很有用,但我不满足于我,因为我非常喜欢使用交互式解释器。

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

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

现在,multiprocessing可以在close()上致电sys.stdin就好了,一切顺利。

请注意,在启动阶段附加虚拟close()是不够的。我发现在每次调用multiprocessing.Process()之前都必须这样做;不过,我没有尝试使用流程池。

答案 1 :(得分:0)

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

根据经验,验证您的{hardware | VM}并行工作的能力:

import multiprocessing
multiprocessing.cpu_count()

PyCharm IDE内部的并行多处理

不要浪费CPU时间来在任何IDE中运行已经微调过的代码,无论是在IDE集成的python引擎上还是在IDE-remote-python-engine上(PyScripter IDE都是如此)等人。

一个运行良好的python代码将在一个简单的命令行中安全,快速地运行,如 C:\Python2.7\python.exe aRandomForestJOB.py

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

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

Nathan Lemoine报道:

''” PyCharm 3包含本地终端。我在那个终端打开python并运行正常,这使我可以进行交互式调试和工作。这让我觉得这是PyCharm运行交互式解释器的方式所特有的问题。但由于解决方法非常简单,因此并不是真正的问题。 '''

答案 2 :(得分:0)

为了让像我这样的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: