【问题标题】:Python3 cannot find libdnet - Scapy portPython3 找不到 libdnet - Scapy 端口
【发布时间】:2015-06-25 20:10:50
【问题描述】:

我正在尝试在我的项目中使用Python3 fork of Scapy,但我无法让它与所有依赖项一起运行。我目前正在运行 OSX Yosemite。特别是,Python3 似乎找不到 libdnet.so。我有 Scapy 在 Python2 中工作,所以 libdnet 存在于我的系统上 - 我如何让它在 Python3 中工作? Python3 是否有受支持的 libdnet 版本?错误如下:

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from scapy.all import *
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scapy/all.py", line 16, in <module>
from .arch import *
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scapy/arch/__init__.py", line 75, in <module>
from .bsd import *
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scapy/arch/bsd.py", line 12, in <module>
from .unix import *
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scapy/arch/unix.py", line 21, in <module>
from .pcapdnet import *
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scapy/arch/pcapdnet.py", line 22, in <module>
from .cdnet import *
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scapy/arch/cdnet.py", line 17, in <module>
raise OSError("Cannot find libdnet.so")
OSError: Cannot find libdnet.so

谢谢

【问题讨论】:

    标签: python macos python-3.x scapy


    【解决方案1】:

    我遇到了同样的问题。我用自制软件安装了 libdnet 和 libpcap(例如,在 /usr/local/lib 中),但 ctypes 永远无法使用 find_library() 找到它们。这不是一个解决方案,而是一个让 scapy 导入的技巧。我在我的 scapy 安装中修改了以下两个文件以指定库的完整路径:

    • 我将scapy/arch/cdnet.py 中的find_library('dnet') 更改为find_library('/usr/local/lib/libdnet')
    • 我将scapy/arch/winpcapy.py 中的find_library('pcap') 更改为find_library('/usr/local/lib/libpcap')

    另一个侵入性较小的想法是将这两个库从 /usr/local/lib 链接到 /usr/lib...

    【讨论】:

    • 在 El Capitan 和 Sierra,由于System Integrity Protection,即使使用sudo,也无法在/usr/lib 中创建链接。相反,请使用/usr/local/lib。此外,Mac OS X (MacOS) 上的文件扩展名是.dylib,而不是.so。此外,如果使用 MacPorts,文件将位于 /opt/local/lib。有关更多详细信息,请参阅此SO article
    【解决方案2】:

    这是生成异常的代码片段。

    from ctypes import *
    from ctypes.util import find_library
    _lib_name = find_library('dnet')
    if not _lib_name:
      raise OSError("Cannot find libdnet.so")
    _lib=CDLL(_lib_name)
    

    显然,python ctypes 在您的计算机上找不到 dnet 库。一旦你可以得到 ctypes find dnet,它应该可以与 scapy 一起使用。

    此外,dnet 的使用不是强制性的。在禁用 dnet 的情况下尝试 scapy。您不需要它来解析数据包。并且根据系统的不同,对于一些有限的发送,scapy 也可以使用 pcap。

    请在https://github.com/phaethon/scapy提出问题

    【讨论】:

    • 我不确定如何让 ctypes 找到我的 dnet 库 - 似乎 libdnet 只想安装到 Python2 路径。如何为 scapy 禁用 dnet?
    • 来自 python doc:在 OS X 上,find_library() 尝试了几种预定义的命名方案和路径来定位库......不幸的是,我没有 OS X 来告诉你如何安装 dnet。你能在你的硬盘上找到 libdnet.so 吗?并将其复制到某个好的位置 /usr/local/lib 或 /usr/lib?得到 OSError 后,是否还能使用 scapy 功能(发送/接收数据包除外)?
    • 我在 OS X 机器上检查了 - 你只需要使用 Homebrew brew.sh 安装 libdnet (brew install libdnet)。如果成功,scapy 工作正常。
    • 目前好像在/Library/Python/2.7/site-packages/dnet.so。我已经尝试将它复制到 3.4 库位置以及 /usr/local/lib,但 ctypes 仍然找不到它。在 OSError 之后,我无法使用任何 scapy 功能。
    • brew 安装成功,并在 usr/local 中有符号链接,但 ctypes 在 python3 中仍然找不到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多