0

我正在运行 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 安装的模块应该如何加载?

4

1 回答 1

0

感谢 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依赖于python 2.7的某些功能。

于 2014-11-09T14:32:01.697 回答