0

私はDebian wheezyを実行しており、システムパッケージからmitmproxyをインストールし、pipを使用してpushbullet.py( https://github.com/randomchars/pushbullet.py )をインストールしました。

apt-get install mitmproxy
pip install pushbullet.py

次のように、Python コマンドラインからインポートすると、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 に答える