2015-06-25 52 views
0

我想在我的項目中使用Python3 fork of Scapy,但我無法使其運行時出現所有依賴項。我目前正在運行OSX Yosemite。特別是,看來Python3無法找到libdnet.so。我有Scapy在Python2中工作,所以我的系統上存在libdnet - 我如何才能在Python3中工作?是否支持Python3的libdnet版本?誤差如下:Python3無法找到libdnet - Scapy端口

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 

由於

回答

0

這是產生異常的代碼片段。

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庫。一旦你可以找到dnet的ctypes,它應該與scapy一起工作。

此外,dnet的使用不是強制性的。嘗試禁用dnet的scapy。你不需要它來解析數據包。取決於系統,對於一些有限的發送scapy也可以使用pcap。

請在https://github.com/phaethon/scapy

+0

我是確定如何讓ctypes找到我的dnet庫 - 似乎libdnet只想安裝到Python2路徑。 如何禁用scnet的dnet? – Malikari

+0

來自python文檔:在OS X上,find_library()會嘗試幾個預定義的命名方案和路徑來找到庫...不幸的是,我沒有OS X來告訴你如何安裝dnet。你能在你的硬盤上找到libdnet.so嗎?並將其複製到一些好的位置/ usr/local/lib或/ usr/lib?在得到OSError之後,你仍然可以使用scapy功能(發送/接收數據包除外)嗎? –

+0

我在OS X機器上檢查過 - 你只需要用自制軟件http://brew.sh(brew install libdnet)安裝libdnet。如果成功,scapy可以正常工作。 –

2

我跑在這個同樣的問題提交的問題。我用自制軟件安裝了libdnet和libpcap(例如,在/usr/local/lib),但ctypes無法使用find_library()找到它們。這不是一個解決方案,而是一個讓scapy導入的黑客。我修改了我的Scapy的安裝以下兩個文件複製到指定的完整路徑庫:

  • 我​​改變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 ...

+0

在El Capitan和Sierra,由於[系統完整性保護](https://support.apple.com/en-us/HT204899),即使使用'sudo',也無法在'/ usr/lib'。相反,使用'/ usr/local/lib'。另外,Mac OS X(MacOS)上的文件擴展名是'.dylib',而'.so'。 此外,如果使用MacPorts,這些文件將存在於'/ opt/local/lib'中。 請參閱此[SO文章](http://stackoverflow.com/questions/36730549/cannot-create-a-symlink-inside-of-usr-bin-even-as-sudo)瞭解更多詳細信息。 – tdfunk