質問
私はPythonが比較的新しく、Pythonネットワーク操作ツールであるScapyでのプログラミングに問題があります。ただし、それがPython初心者の問題と同じくらいScapyの問題かどうかはわかりません。 scapyサイトでは、私ができないサンプルプログラムを提供しています自分のマシンで実行する:
#! /usr/bin/env python
import sys
from scapy import sr1,IP,ICMP
p=sr1(IP(dst=sys.argv[1])/ICMP())
if p:
p.show()
取得先:
Traceback (most recent call last):
File "test.py", line 4, in <module>
from scapy import sr1,IP,ICMP
ImportError: cannot import name sr1
それで私の質問は、Pythonライブラリをインストールするときに、パスなどを変更する必要がありますか?また、scapyパッケージの内容を伝えるためにインタープリターで実行できるものはありますか? scapy import *
からは問題なく実行できますが、その中身がわからないため、使用するのは困難です。
解決
Federico Ramponiの警告で、「scapyはライブラリとしてではなく、単独でインタープリターとして使用する必要があります」と、質問の非sccapy固有の部分に答えたいと思います。
Q: Pythonライブラリをインストールするときに、パスなどを変更する必要がありますか?
A:システム全体で PYTHONPATH
を変更することについて話していると思います。これは通常、必要ではないか、良いアイデアです。
サードパーティのPythonライブラリは、 /usr/lib/python2.5/site-packages
などのシステムディレクトリにインストールするか、ローカルにインストールする必要があります。この場合、< code> PYTHONPATH をMakefileまたはドライバーシェルスクリプトに追加します。
Q:また、scapyパッケージの内容を伝えるためにインタープリターで実行できるものはありますか?
A:次のようなことができます:
>>> import scapy
>>> dir(scapy)
またはさらに良い:
>>> import scapy
>>> help(scapy)
コメントで尋ねられたボーナス質問。
Q:「import scapy」は「from scapy import *」と同じですか?
A: import scapy
は、ローカル名前空間のscapy名をscapyモジュールオブジェクトにバインドします。 OTOH、 scapy import *
はモジュール名をバインドしませんが、scapyモジュールで定義されたすべてのパブリック名はローカル名前空間でバインドされます。
Pythonリファレンスマニュアルの段落6および7を参照してください、 6.12インポート文。
他のヒント
scapyでsr1が見つからないことがわかります。あなたがどれだけ初心者かはわかりませんが、通訳はいつもあなたの友達です。インタプリタを起動し(コマンドラインで&quot; python&quot;と入力するだけ)、プロンプト(&gt;&gt;&gt;)と入力します(ただし、&gt;を入力しないでください。自動的に表示されます)。
>>> import scapy
>>> from pprint import pformat
>>> pformat(dir(scapy))
最後の行は多くのものを出力するはずです。 「sr1」、「IP」、「ICMP」はどこにでもありますか?そうでない場合、例に問題があります。
ヘルプ(scapy)も試してください
これは、scapyをインストールし、実際のソースファイルを自分で確認することなく、私がどれだけ手助けできるかについてです。
scapy パッケージは、ネットワークの操作と監視のためのツールです。あなたがそれで何をしようとしているのか興味があります。友達をスパイするのは失礼です。 :-)
coventry@metta:~/src$ wget -q http://www.secdev.org/projects/scapy/files/scapy-latest.zip
coventry@metta:~/src$ unzip -qq scapy-latest.zip
warning [scapy-latest.zip]: 61 extra bytes at beginning or within zipfile
(attempting to process anyway)
coventry@metta:~/src$ find scapy-2.0.0.10 -name \*.py | xargs grep sr1
scapy-2.0.0.10/scapy/layers/dns.py: r=sr1(IP(dst=nameserver)/UDP()/DNS(opcode=5,
scapy-2.0.0.10/scapy/layers/dns.py: r=sr1(IP(dst=nameserver)/UDP()/DNS(opcode=5,
scapy-2.0.0.10/scapy/layers/inet6.py:from scapy.sendrecv import sr,sr1,srp1
scapy-2.0.0.10/scapy/layers/snmp.py: r = sr1(IP(dst=dst)/UDP(sport=RandShort())/SNMP(community=community, PDU=SNMPnext(varbindlist=[SNMPvarbind(oid=oid)])),timeout=2, chainCC=1, verbose=0, retry=2)
scapy-2.0.0.10/scapy/layers/inet.py:from scapy.sendrecv import sr,sr1,srp1
scapy-2.0.0.10/scapy/layers/inet.py: p = sr1(IP(dst=target, options="\x00"*40, proto=200)/"XXXXYYYYYYYYYYYY",timeout=timeout,verbose=0)
scapy-2.0.0.10/scapy/sendrecv.py:def sr1(x,filter=None,iface=None, nofilter=0, *args,**kargs):
最後の行によると、 sr1
は scapy.sendrecv
で定義されている関数です。誰かがドキュメントのバグを作成者に提出する必要があります。