背景:
我正在尝试使用pypy解释器启动石墨。
错误:
启动石墨(*)导致
ImportError: cannot import name 'threadpool'
,
即使启动python(pypy)解释器并输入from twisted.python import threadpool
也可以。
完整的堆栈跟踪:
15/09/2014 13:29:09 :: File "app_main.py", line 75, in run_toplevel
15/09/2014 13:29:09 :: File "/opt/graphite/bin/carbon-cache.py", line 30, in <module>
15/09/2014 13:29:09 :: run_twistd_plugin(__file__)
15/09/2014 13:29:09 :: File "/opt/graphite/lib/carbon/util.py", line 93, in run_twistd_plugin
15/09/2014 13:29:09 :: runApp(config)
15/09/2014 13:29:09 :: File "/home/vagrant/test2/site-packages/twisted/scripts/twistd.py", line 23, in runApp
15/09/2014 13:29:09 :: File "/home/vagrant/test2/site-packages/twisted/application/app.py", line 380, in run
15/09/2014 13:29:09 :: File "/home/vagrant/test2/site-packages/twisted/scripts/_twistd_unix.py", line 193, in postApplication
15/09/2014 13:29:09 :: File "/home/vagrant/test2/site-packages/twisted/scripts/_twistd_unix.py", line 390, in startApplication
15/09/2014 13:29:09 :: File "/home/vagrant/test2/site-packages/twisted/application/app.py", line 658, in startApplication
15/09/2014 13:29:09 :: File "/home/vagrant/test2/site-packages/twisted/application/service.py", line 282, in startService
15/09/2014 13:29:09 :: File "/home/vagrant/test2/site-packages/twisted/application/service.py", line 282, in startService
15/09/2014 13:29:09 :: File "/opt/graphite/lib/carbon/writer.py", line 191, in startService
15/09/2014 13:29:09 :: reactor.callInThread(writeForever)
15/09/2014 13:29:09 :: File "/home/vagrant/test2/site-packages/twisted/internet/base.py", line 997, in callInThread
15/09/2014 13:29:09 :: File "/home/vagrant/test2/site-packages/twisted/internet/base.py", line 989, in getThreadPool
15/09/2014 13:29:09 :: File "/home/vagrant/test2/site-packages/twisted/internet/base.py", line 954, in _initThreadPool
15/09/2014 13:29:09 :: ImportError: cannot import name 'threadpool'
我在centos 6.5上使用pypy(2.3.1-linux_x86_64-portable) 并运行pip安装扭曲,低语(并应用额外的patch)
(*)test2 / bin / python /opt/graphite/bin/carbon-cache.py --instance = a start
修改
virtualenv名为test2。
test2 / site-packages / twisted / python / threadpool.py {,c}显示twisted has threadpool
test2/bin/pypy --info
显示[usemodules] thread = True
'twisted.python.threadpool' in sys.modules
在导入失败之前返回false
EDIT2:
在调用堆栈中添加from twisted.python import threadpool
(例如在/opt/graphite/lib/carbon/util.py中)可以使石墨工作。
答案 0 :(得分:2)
你的Twisted安装是否有线程池模块?在threadpool.py
目录中查找名为twisted/python/
的文件。如果缺少这个,你的Twisted安装已经被破坏了。您可以通过重新安装Twisted来修复它(可能会破坏你的...... virtualenv?并创建一个新的)。
是否有stdlib线程模块? Twisted的线程支持仅在底层Python运行时支持线程时有效。如果缺少这个,您可能需要不同的Python运行时。 PyPy支持线程,但也许你有一个以某种方式禁用线程的构建。
如果这些都不是问题,您可以通过在启用导入调试的情况下运行Python来了解更多信息。 python -v
启用最少的导入调试,python -vv
启用更详细的导入调试。我不确定它们在PyPy上的行为是否与它们在CPython上的行为相同。希望他们这样做或事情有点困难。
如果这没有帮助,那么你也可以尝试在导入twisted.python.threadpool
模块之前在pdb中添加一个断点,然后仔细踩一下,随时检查状态。要检查的一件事可能是sys.modules
是否有'twisted.python.threadpool
&#39;已经存在的项目,如果已经存在,则与之关联的值是什么。 None
将阻止导入系统甚至在磁盘上查找模块实现并且只是失败。
答案 1 :(得分:2)
我有类似的问题。问题是在carbon.conf的USER设置中,我指定了自己的用户&#34; graphite&#34;。执行此操作时,carbon-cache守护程序将以此用户身份运行。石墨用户没有权限使用扭曲的模块。解决方案是 chown -R graphite /usr/lib64/python2.6/site-packages/twisted