我正在使用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的事实有关,但我不确定如何让它工作。任何想法都表示赞赏 - 谢谢!
答案 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()
不要浪费CPU时间来在任何IDE中运行已经微调过的代码,无论是在IDE集成的python引擎上还是在IDE-remote-python-engine上(PyScripter IDE都是如此)等人。
一个运行良好的python代码将在一个简单的命令行中安全,快速地运行,如 C:\Python2.7\python.exe aRandomForestJOB.py
如果PyCharm控制台仍然阻止您进行多处理的路径, 尝试在独立的python解释器中运行相同的代码,以重新生成问题并发布验尸消息,如果您的代码在那里崩溃。
sys.stdin.close()
错误解决方法''” 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: