Python - Проблемы с библиотекой
-
04-07-2019 - |
Вопрос
Я относительно новичок в Python, и у меня возникают проблемы при программировании с помощью Scapy, инструмента управления сетями Python. Тем не менее, я не могу сказать, является ли это проблемой Scapy так же, как проблемой «быть новичком в Python». На 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 *
, но поскольку я понятия не имею, что внутри него, его трудно использовать.
Решение
С предупреждением от Федерико Рампони "Вы должны использовать scapy как переводчика, а не как библиотеку", я хочу ответить на не связанные с scapy части вопроса.
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: Является ли 'импорт scapy' таким же, как 'из импорта scapy *'?
A: import scapy
связывает имя scapy в локальном пространстве имен с объектом модуля scapy. OTOH, from scapy import *
не привязывает имя модуля, но все публичные имена, определенные в модуле scapy, связаны в локальном пространстве имен.
См. пункты 6 и 7 Справочного руководства по Python, 6.12. заявление на импорт .
Другие советы
У меня была такая же проблема, при использовании scapy v2.x
from scapy.all import *
вместо v1.x
from scapy import *
как написано здесь
Наслаждайся этим =)
Он говорит вам, что не может найти sr1 в scapy. Не уверен, насколько ты новичок, но переводчик всегда твой друг. Запустите интерпретатор (просто введите «python» в командной строке) и введите в командной строке (> > >) (но не вводите символы > ;, они будут отображаться самостоятельно): р>
>>> 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
. Кто-то должен сообщить об ошибке документации автору.