Scapy.all导入*不起作用


问题内容

因此,我在Ubuntu中为Scapy编写了一个小脚本。

#!/usr/bin/env python
import sys
#from scapy.all import *
try 
   import scapy
   except ImportError:
     del scapy
     from scapy import all as scapy
i= IP()
t= TCP()
i.dst='192.168.56.100'
t.dport=22
pakket=i/t
answered,unanswered=sr(pakket)
answered.nsummary()

我在这里写了“ try”是因为另一个话题(尝试将其作为解决方案)。我当前的输出与此代码如下

Traceback (most recent call last):
File "./scapy.py", line 5, in <module>
import scapy
File "/home/nicholas/scapy.py", line 9, in <module>
i=IP()
NameError: name 'IP' is not defined

从scapy.all import *尝试时,不带“ try”。

Traceback (most recent call last):
File "./scapy.py", line 3, in <module>
from scapy.all import *
File "/home/nicholas/scapy.py", line 3, in <module>
from scapy.all import *
ImportError: No module named all

我尝试了在Google上找到的其他导入方式,但仍然无法正常工作。谁能告诉我我在做什么错?(不要介意这篇文章的缩进)


问题答案:

从查看scapy的源代码来看,scapy包对import任何东西都没有出现,也没有定义__all__in
__init__。因此,您需要先显式import scapy.all(或from scapy import all)再从中进行from scapy.all import任何其他操作,因为它sys.modules尚不存在。请注意,这仅需在程序流程中执行一次,因为在解释器导入模块之后,无论从何处执行,此代码将对之后执行的所有代码可用。查看有关模块Python文档以及如何import(特别是导入包)如何工作以了解更多详细信息。

编辑:我想我现在看到了问题,我只是在注意堆栈跟踪的错误部分。可以肯定,这里要处理的是名称冲突。您的文件名为scapy.py,因此当您import scapy从该文件的上下文开始时,实际上是在将文件本身作为模块导入。由于您的文件没有名为的子模块all(因为它不是软件包,所以没有,),因此您将看到导入错误。尝试将文件名切换为与要导入其中的任何程序包或模块不冲突的文件名,看看效果是否更好。

顺便说一句,请注意堆栈中的痕迹,即您的导入实际上实际上是递归地调用您的一个文件。这应该是在导入过程中有些麻烦的线索。