pickle.PicklingError: Can't pickle <function scan_progressive at 0x01C255B0>:...

在安装了python-nmap0.14后,写了一个简单的测试执行失败。

Traceback (most recent call last):
File "<string>", line 1, in <module>
File "D:\opt\Python27\lib\multiprocessing\forking.py", line 373, in main
prepare(preparation_data)
File "D:\opt\Python27\lib\multiprocessing\forking.py", line 488, in prepare
'__parents_main__', file, path_name, etc
File "E:\Workspace\scanner_01.py", line 13, in <module>
nma.scan(hosts='192.168.18.0/24', arguments='-sP')
File "D:\opt\Python27\lib\site-packages\nmap\nmap.py", line 417, in scan
self._process.start()
File "D:\opt\Python27\lib\multiprocessing\process.py", line 130, in start
self._popen = Popen(self)
File "D:\opt\Python27\lib\multiprocessing\forking.py", line 271, in __init__
dump(process_obj, to_child, HIGHEST_PROTOCOL)
File "D:\opt\Python27\lib\multiprocessing\forking.py", line 193, in dump
ForkingPickler(file, protocol).dump(obj)
File "D:\opt\Python27\lib\pickle.py", line 224, in dump
self.save(obj)
File "D:\opt\Python27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "D:\opt\Python27\lib\pickle.py", line 419, in save_reduce
save(state)
File "D:\opt\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "D:\opt\Python27\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "D:\opt\Python27\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "D:\opt\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "D:\opt\Python27\lib\pickle.py", line 747, in save_global
(obj, module, name))
pickle.PicklingError: Can't pickle <function scan_progressive at 0x01C255B0>: it
's not found as nmap.nmap.scan_progressive

代码如下:
import nmap
nma = nmap.PortScannerAsync()

def callback_result(host, scan_result):
print '------------------'
print host, scan_result

nma.scan(hosts='192.168.18.0/24', arguments='-sP')

while nma.still_scanning():
print("Waiting ...")
nma.wait(2)

起初以为代码写错了,然后我找到nmap安装目录下的example.py执行,发生同样的错误。经过反复跟踪,发现在pickle.py文件745行抛出了错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "D:\opt\Python27\lib\site-packages\nmap\nmap.py", line 413, in scan
target=self.scan_progressive,
AttributeError: 'PortScannerAsync' object has no attribute 'scan_progressive'

然后又阅读nmap的源码nmap.py,终于发现在402行,方法scan_progressive被定义在scan方法内部,导致pickle失败。

解决方法:
将方法Scan_progressive定义到外面,并将nmap.py 413行从
target=scan_progressive,
改为:
target=self.progressive,
即可。


总结:不晓得有木有其他的影响,但是得出一个结论,别人的东西,不能尽信,是钢是铁,试了才晓得。。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值