【问题标题】:Scapy.all import * does not workScapy.all 导入 * 不起作用
【发布时间】:2012-11-16 14:22:14
【问题描述】:

所以,我在 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 * 尝试时,不使用“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 上找到的不同导入方式,但仍然无法正常工作。谁能告诉我我做错了什么? (不要介意这篇文章的缩进)

【问题讨论】:

  • 请修正缩进,它们很重要。
  • 如果您不使用其他任何东西(没有 try-except),请尝试 from scapy.all import IP,TCP,sr 之类的东西
  • 在尝试时我仍然收到“没有模块名称为全部”

标签: python ubuntu scapy


【解决方案1】:

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

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

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

【讨论】:

  • 这并没有真正帮助我,仍然会得到类似“没有名为全部的模块”之类的东西
  • 编辑了我的答案,我认为应该可以解决您的问题。
  • 好吧,我们正在取得进展。但是当我更改名称时,它正在抱怨一个“糟糕的幻数”。我删除了 stackoverflow.com/questions/514371/… 中的 scapy.pyc 。但是你如何用正确的幻数取回它呢? *编辑,现在似乎可以工作了!我把 python3 放在了脚本执行的前面,但这似乎没有必要,谢谢!
  • 说真的,谢谢。永远不会想到问题是将我的测试文件命名为 scapy
【解决方案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 并且一切正常,它与包位置无关,只是文件名。

【讨论】:

    【解决方案3】:

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

    在您的情况下,您的文件名是scapy.py。之后你导入 scappy。在这里,您不小心将您的 python 文件称为代码中的对象,因为您的编译器无法理解要调用的类型(文件或库)。那里出现了那个错误。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        当前版本的正确导入是:

        from scapy.all import *
        

        【讨论】:

        • scapy 2.4.3 和 Python 3.7 仍然在 import * from all I need import e.g.从 scapy.layers.inet 导入 IP、UDP、in4_chksum
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-10
        • 2018-02-25
        • 2014-03-17
        • 2015-04-18
        • 2017-10-13
        • 2018-11-16
        相关资源
        最近更新 更多