PyCharm:使用Scapy出现未解决的引用问题

12

我正在使用scapy和Python编写一个网络工具。
作为IDE,我使用的是PyCharm。
我的代码是可以运行的。如果我运行它,一切都会按照预期发生。

我的问题是PyCharm给了我一些错误提示。
它将每个IP、TCP、Ether等的使用标记为“未定义的引用...”

我代码中相关部分如下:

#!/usr/bin/env python
from scapy.all import *

...  
...  

syn = IP(src=src_ip, dst=dst_ip) / TCP(sport=src_port, dport=dst_port, seq=src_seq, flags="S")

...

我尝试了很多在谷歌上找到的方法,比如将我的src文件夹添加为源代码根目录,我刷新了所有可以找到的缓存并且重新启动了PyCharm数十次,但是都没有起作用...

由于代码可以运行,所以这只是一个小问题,但是我仍然希望我的IDE能够正常工作。

我是在MacOS下使用Virtual Environment。


你正在使用虚拟环境吗? - hamza-jutt
哦,忘了提一下...是的,我正在使用虚拟环境。 - NIoSaT
你正在配置PyCharm使用Virtualenv吗? - hamza-jutt
是的,PyCharm已经配置了VirtualEnv作为“解释器”,我通过PyCharm安装了所有需要的包,而不是在虚拟环境内使用pip安装。 - NIoSaT
我也遇到了同样的问题。这里有什么解决方案吗? - MikeSchem
3个回答

15
这是一个PyCharm问题。Scapy使用动态加载(使用importlib)来加载许多模块/自定义模块,但PyCharm无法检测到。这允许用户选择要加载哪些层。
解决方法是从相关的scapy文件中导入所需内容,而不使用all。这样做更清晰但更繁琐。或者,如果您不需要什么干净的东西,可以在IDE中使用“添加异常”。
以下是一些有用的模块:
  • scapy.layers.inet,其中可以获取IP、TCP等。
  • scapy.layers.inet6
  • scapy.layers.dns
  • scapy.sendrecv具有srp、sr、sr1、sendp、send等功能...
  • scapy.supersocket可直接访问scapy的套接字
  • scapy.layers.l2具有Ether、ARP等功能。
  • scapy.layers.dot11适用于802.11设备
  • scapy.utils适用于wrpcaprdpcap...
  • scapy.config适用于conf对象(该对象具有属性,例如conf.routeconf.route6
我建议的做法是打开Scapy shell(或在控制台中导入from scapy.all import *),并使用help(...)检查层/函数来自哪个模块。你还可以查看在线API参考文档(它有一个搜索栏),在这里

8

我曾遇到同样的问题,可以尝试以下导入方式:

from scapy.layers.inet import IP, UDP, wrpcap, Ether

它对我起作用了。


0
Ether, IP...在scapy.all中没有直接定义 :-(
现在,PyCharm可以建议你从相关的scapy文件中导入你需要的内容: enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接