我正在运行Debian wheezy,并且已经从系统包中安装了mitmproxy,并使用pip安装了pushbullet.py (https://github.com/randomchars/pushbullet.py)。
apt-get install mitmproxy
pip install pushbullet.py当我从python cmdline导入时,Pushbullet可以工作,如下所示:
$ python
Python 2.7.3 (default, Mar 13 2014, 11:03:55)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from pushbullet import PushBullet
>>> pb=PushBullet(myapikeyremoved)
>>>但是,当我尝试从mitmproxy脚本中导入pushbullet模块时,它无法找到该模块。
$ echo "from pushbullet import PushBullet" > mypb.py
$ mitmproxy -s mypb.py
Script load error: Traceback (most recent call last):
File "/usr/lib/python2.6/dist-packages/libmproxy/script.py", line 48, in load
execfile(path, ns, ns)
File "mypb.py", line 1, in <module>
from pushbullet import PushBullet
ImportError: No module named pushbullet现在,pip已经将pushbullet.py及其依赖项python-magic、requests、backports.ssl-match-hostname安装到/usr/local/lib/python2.7/dist-packages/中。似乎cmdline python已经找到了pip安装的包,但mitmproxy由于某种原因无法找到。
因此,我尝试通过PYTHONPATH或系统路径添加路径,但我认为我仍然做错了什么。
$ cat mypb.py
import sys
sys.path.append('/usr/local/lib/python2.7/dist-packages')
from pushbullet import PushBullet
pb=PushBullet(myapikeyremoved)
$ mitmproxy -s mypb.py
Script load error: Traceback (most recent call last):
File "/usr/lib/python2.6/dist-packages/libmproxy/script.py", line 48, in load execfile(path, ns, ns)
File "mypb.py", line 4, in <module>
pb=PushBullet(myapikeyremoved)
File "/usr/local/lib/python2.7/dist-packages/pushbullet/pushbullet.py", line 26, in __init__
self.refresh()
File "/usr/local/lib/python2.7/dist-packages/pushbullet/pushbullet.py", line 223, in refresh
self._load_devices()
File "/usr/local/lib/python2.7/dist-packages/pushbullet/pushbullet.py", line 32, in _load_devices
resp_dict = resp.json()
TypeError: 'dict' object is not callable有没有人能解释为什么所有东西都能通过cmdline python运行,但在mitmproxy中作为脚本加载时却失败了,以及如何修复这个问题?如何加载通过pip安装的模块?
发布于 2014-11-09 22:32:02
感谢Christian Rapp的评论,我进一步研究了为什么mitmproxy的libmproxy是从/usr/lib/python2.6加载的。事实证明(至少在debian的wheezy包中),mitmproxy shebang显式指定了python2.6:
$ head -1 /usr/bin/mitmproxy
#! /usr/bin/python2.6这就解释了为什么mitmproxy找不到pushbullet模块,而是查找2.6版本的目录。
我猜想当我显式加载模块时出现"TypeError:'dict‘object is not callable“错误也是因为pushbullet依赖于Python2.7的一些特性。
https://stackoverflow.com/questions/26828009
复制相似问题