【问题标题】:Debian mitmproxy fails to find/load python-2.7 modules installed via pipDebian mitmproxy 无法找到/加载通过 pip 安装的 python-2.7 模块
【发布时间】:2014-11-09 12:12:33
【问题描述】:

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

【问题讨论】:

  • which -a python 输出什么
  • 为什么您尝试从与您的脚本运行的不同 python 版本导入包?最重要的是,你为什么将 python 2.7 安装到 /usr/local? Debian wheezy 自带 python 2.7 packages.debian.org/de/wheezy/python
  • which -a python => /usr/bin/python.是的,我正在运行 python 2.7.3(来自上面的 cmdline 输出)。准确地说,2.7.3-4+deb7。不知道你从哪里得到我将 python 2.7 安装到 /usr/local 的想法。 debian mitmproxy 将安装文件打包到 /usr/lib/python2.6/dist-packages/libmproxy 和 /usr/lib/python2.7/dist-packages/libmproxy。是 pip 将 pushbullet 和依赖项安装到 /usr/local

标签: python python-2.7 debian python-2.6 mitmproxy


【解决方案1】:

感谢 Christian Rapp 的 cmets,我进一步了解了为什么 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 的某些特性。

【讨论】:

    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 2021-06-04
    • 2016-04-17
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    相关资源
    最近更新 更多