2016-02-18 81 views
5

Mój plik python działa dobrze z Pythona bezpośrednio:pyinstaller: AttributeError: 'moduł' obiekt ma atrybut 'RSA'

python detectIPConflict.py 

Jednak gdy skrypt pakowane przez PyInstaller:

pyinstaller --onefile detectIPConflict.py 
./dist/detectIPConflict 

Tu idzie błąd:

WARNING: No route found for IPv6 destination :: (no default route?) 
Traceback (most recent call last): 
    File "<string>", line 3, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/PyInstaller-3.1.1-py2.7.egg/PyInstaller/loader/pyimod03_importers.py", line 389, in load_module 
    exec(bytecode, module.__dict__) 
    File "scapy/all.py", line 46, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/PyInstaller-3.1.1-py2.7.egg/PyInstaller/loader/pyimod03_importers.py", line 389, in load_module 
    exec(bytecode, module.__dict__) 
    File "scapy/crypto/__init__.py", line 17, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/PyInstaller-3.1.1-py2.7.egg/PyInstaller/loader/pyimod03_importers.py", line 389, in load_module 
    exec(bytecode, module.__dict__) 
    File "scapy/crypto/cert.py", line 19, in <module> 
AttributeError: 'module' object has no attribute 'RSA' 
detectIPConflict returned -1 

Mam też dążyć do scapy/crypto/cert.py, w linii 19:

from Crypto.PublicKey import * 

nie mogę znaleźć, dlaczego ten błąd się stało. Jestem zdezorientowany.

Ktoś może pomóc? Informacje

Wersja:

  • Python: 2.7.6
  • pyinstaller: 3.1.1
  • scapy: 2.3.2 (zainstalowany przez komendę PIP)
  • pycrypto: 2.6.1

Oto detectIPConflict.py:

#!/usr/bin/env python 
# -*- coding:utf-8 -*- 
from scapy.all import * 

def ip_conflict(): 
    ipscan='10.2.86.190/23' 
    ip_dict = dict() 
    ip_me = get_if_addr('eth0') 
    mac_me = get_if_hwaddr('eth0') 
    print "--------IP ME---------" 
    print ip_me, "--", mac_me 
    print "----------------------" 
    ip_dict[ip_me] = mac_me 
    try: 
     ans,unans=srp(Ether(dst="FF:FF:FF:FF:FF:FF")/ARP(pdst=ipscan),iface="br0", timeout=2,verbose=False) 
    except Exception,e: 
     print str(e) 
    else: 
     print (" MAC   -- IP ") 
     for snd,rcv in ans: 
      list_mac=rcv.sprintf("%Ether.src% -- %ARP.psrc%") 
      mac = rcv.sprintf("%Ether.src%") 
      ip = rcv.sprintf("%ARP.psrc%") 
      # print mac,'-->',ip 
      if ip not in ip_dict: 
       ip_dict[ip] = mac 
    for has_ip in ip_dict.keys(): 
     print has_ip, "------ " + ip_dict[has_ip] 
if __name__ == "__main__": 
    ip_conflict() 

Odpowiedz

3

Mam ustalone tego błędu przez modyfikację python2.7/dist-pakiety/scapy/crypto/code cert.py: Zmienić linii 19,20,21:

from Crypto.PublicKey import RSA 
from Crypto.Cipher import ARC2 
from Crypto.Hash import MD2 

Działa to dla mnie .

Jednak nie wiem, dlaczego "import *" nie może zostać rozpoznany przez program odinstalowujący. Wdzięczny fort za wszelkie wyjaśnienia.