我正在使用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: