Scapy.all import * 不起作用

问题描述 投票:0回答:5

所以,我在 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()

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

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

仅使用 from scapy.all import * 尝试时,无需“尝试”。

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上找到的不同导入方式,但仍然不起作用。谁能告诉我我做错了什么吗? (不要介意这篇文章的缩进)

python ubuntu scapy
5个回答
8
投票

从 scapy 源代码来看,scapy 包似乎没有

import
任何东西,也没有在
__all__
中定义
__init__
。因此,您需要显式地
import scapy.all
(或
from scapy import all
)才能从中
from scapy.all import
获得任何其他内容,因为它还不会出现在
sys.modules
中。请注意,这只需要在程序流中发生一次,因为在解释器导入模块之后,从那时起执行的所有代码都可以使用该模块,无论它在哪里。请查看 Python 模块文档 以及
import
(特别是导入包)如何工作以了解更多详细信息。

编辑: 我想我现在看到了问题,我只是注意到了堆栈跟踪的错误部分。很确定您在这里处理的是名称冲突。您的文件名为

scapy.py
,因此当您从该文件的上下文中
import scapy
时,您实际上是将文件本身作为模块导入。由于您的文件没有名为
all
的子模块(它不能,因为它不是包),因此您会收到所看到的导入错误。尝试将文件名切换为不与您希望导入其中的任何包或模块冲突的名称,然后看看效果是否更好。

顺便说一句,请注意您的堆栈跟踪,您的导入实际上本质上是递归调用您的一个文件。这应该是导入过程中出现问题的线索。


3
投票

我想在@Daniel 的回答中添加一些内容。你真正的问题不是 scapy 包。你真正的问题在于你的 python 文件名。 切勿使用库名称或其内容作为文件名。

就您而言,您的文件名为

scapy.py
。之后你
import scapy
。在这里,您不小心将 python 文件调用为代码中的对象,因为编译器无法理解要调用哪种类型(文件或库)。就出现了那个错误。


2
投票

我在 OSX 上遇到了类似的问题,我安装了 scapy 包

pip install scapy
然后我尝试执行我的测试文件
scapy.py
我得到的错误是:

python scapy.py
Traceback (most recent call last):
File "scapy.py", line 1, in <module>
from scapy.all import *
File "/Users/**/Desktop/scapy-test/scapy.py", line 1, in <module>
from scapy.all import *
ModuleNotFoundError: No module named 'scapy.all'; 'scapy' is not a package

就我而言,是文件名本身导致了无法调用的问题

scapy.py
。我将其更改为
test.py
并且一切正常,它与包位置无关,只是文件名。


1
投票

当当前目录中有

scapy.py
时,我看到了这一点。
scapy.all import *
似乎先在当前目录中查找。


1
投票

当前版本的正确导入是:

from scapy.all import *
© www.soinside.com 2019 - 2024. All rights reserved.