Python 2.7 在scapy中使用PcapReader解析pcap文件后删除该文件

Python 2.7 在scapy中使用PcapReader解析pcap文件后删除该文件,python-2.7,scapy,pcap,Python 2.7,Scapy,Pcap,我正在用scapy中的PcapReader解析一个pcap文件。之后,我想删除pcap文件。但由于这个错误,它很糟糕: OSError: [Errno 26] Text file busy: '/media/sf_SharedFolder/AVB/test.pcap' 这是我的python代码: from scapy.all import * import os var = [] for packet in PcapReader('/media/sf_SharedFolder/AVB/te

我正在用scapy中的PcapReader解析一个pcap文件。之后,我想删除pcap文件。但由于这个错误,它很糟糕:

OSError: [Errno 26] Text file busy: '/media/sf_SharedFolder/AVB/test.pcap'
这是我的python代码:

from scapy.all import *
import os

var = []

for packet in PcapReader('/media/sf_SharedFolder/AVB/test.pcap'):
  var.append(packet[Ether].src)

os.remove('/media/sf_SharedFolder/AVB/test.pcap')
我认为任何pcap文件都会发生此错误

有人知道吗?

您可能想试用Scapy的最新开发版本(从),因为我无法用它重现您的问题

如果不起作用,请使用lsof/media/sf_SharedFolder/AVB/test.pcap检查是否有其他程序打开了您的捕获文件。如果是这样,试着找到(如果可能的话,杀死)那个程序

您可以尝试两种不同的破解方法,以了解到底发生了什么:

测试1:等等

from scapy.all import *
import os
import time

var = []

for packet in PcapReader('/media/sf_SharedFolder/AVB/test.pcap'):
    var.append(packet[Ether].src)

time.sleep(2)
os.remove('/media/sf_SharedFolder/AVB/test.pcap')
测试2:显式关闭

from scapy.all import *
import os

var = []

pktgen = PcapReader('/media/sf_SharedFolder/AVB/test.pcap')
for packet in pktgen:
    var.append(packet[Ether].src)

pktgen.close()
os.remove('/media/sf_SharedFolder/AVB/test.pcap')

找到了解决办法。我将“PcapReader()”替换为“rdpcap()”。在python脚本完成之前,PcapReader似乎一直处于打开状态

这是工作代码:

from scapy.all import *
import os

var = []

p=rdpcap('/media/sf_SharedFolder/AVB/test.pcap')

for packet in p:
  var.append(packet[Ether].src)

os.remove('/media/sf_SharedFolder/AVB/test.pcap')

scapy版本是2.3.3.dev862。lsof说,python和sh正在处理该文件。sh过程是什么?您是否检查过python进程是运行您的脚本的进程?您可以将
print(os.getpid(),os.getppid())
添加到脚本的代码中,以获取其PID及其父级PID。“lsof”表示脚本使用进程“python”(PID 1425)和进程“sh”(PID 1428)运行。脚本的PID是1425,父PID是1404。所以您需要找到1428是什么,因为它可能是导致此错误的进程
ps-ef | grep 1428
获取其命令行?“lsof”提供进程“sh”的PID。但是我应该如何编写代码,以便命令“ps-ef | grep PID_of_sh”使用进程“sh”的PID?类似于“foo=lsof test.pcap的第二个PID”,然后是“ps-ef | grep foo”。这是可行的,但请注意,如果pcap文件很大,可能会耗尽内存(因此无法处理大文件)