2014-11-29 3 views
5

Python-Code bei der Ausführung von PyCharm ohne den angehängten Debugger verhält sich anders als bei der Ausführung mit Pydev angeschlossen.Python: Unterschiedliches Verhalten in Run vs Debug-Modus in PyCharm

Ich habe einen POX SDN-Controller in PyCharm und eine Mininet Simulation von der Konsole, die den von POX geöffneten Abhörsockel verbindet. Im Debug-Modus wird der POX-Prozess beendet, sobald die Mininet-Simulation eine Verbindung herstellt, ohne Fehler zu erzeugen, während sie im Run-Modus wie erwartet weiterarbeitet. Hier ist die Ausgabe:

Run:

/usr/bin/python2.7 /home/wirate/pyretic/pyretic.py pyretic.sdx.main 
Initialize SDX 
SDX: {'_policy': drop, 'notify': None, 'arp_policy': [DynamicPolicy] 
packets 
FwdBucket} 
Creating SDX environment from the config files 
Adding Physical ports for A 
Adding virtual ports for A 
Adding Physical ports for C 
Adding virtual ports for C 
Adding Physical ports for B 
Adding virtual ports for B 
{u'A': {u'A': [1], u'C': [3], u'B': [2]}, u'C': {u'C': [3, 4]}, u'B': {u'B': [2]}} 
{u'A': {u'A': [1], u'C': [3], u'B': [2]}, u'C': {u'A': [1], u'C': [3, 4], u'B': [2]}, u'B': {u'B': [2]}} 
{u'A': {u'A': [1], u'C': [3], u'B': [2]}, u'C': {u'A': [1], u'C': [3, 4], u'B': [2]}, u'B': {u'A': [1], u'C': [3], u'B': [2]}} 
Parsing participant's policies 
Starting VNH Assignment 
After new assignment 
Virtual Next Hop --> IP Prefix: {'VNH1': set([u'110.0.0.0/24', u'100.0.0.0/24']), 'VNH2': set([u'140.0.0.0/24', u'150.0.0.0/24'])} 
Virtual Next Hop --> Next Hop IP Address (Virtual): {'VNH1': '172.0.1.1', 'VNH2': '172.0.1.2', 'VNH': [IPAddress('172.0.1.0'), IPAddress('172.0.1.1'), IPAddress('172.0.1.2'), IPAddress('172.0.1.3'), IPAddress('172.0.1.4'), IPAddress('172.0.1.5'), IPAddress('172.0.1.6'), IPAddress('172.0.1.7'), IPAddress('172.0.1.8'), IPAddress('172.0.1.9'), IPAddress('172.0.1.10'), IPAddress('172.0.1.11'), IPAddress('172.0.1.12'), IPAddress('172.0.1.13'), IPAddress('172.0.1.14'), IPAddress('172.0.1.15')]} 
Virtual Next Hop --> Next Hop Mac Address (Virtual) {'VNH1': aa:00:00:00:00:01, 'VNH2': aa:00:00:00:00:02, 'VNH': 'aa:00:00:00:00:00'} 
Completed VNH Assignment 
POX 0.2.0 (carp)/Copyright 2011-2013 James McCauley, et al. 
Connected to pyretic frontend. 
DEBUG:core:POX 0.2.0 (carp) going up... 
DEBUG:core:Running on CPython (2.7.8/Oct 20 2014 15:05:19) 
DEBUG:core:Platform is Linux-3.16.0-24-generic-x86_64-with-Ubuntu-14.10-utopic 
INFO:core:POX 0.2.0 (carp) is up. 
DEBUG:openflow.of_01:Listening on 0.0.0.0:6633 
INFO:openflow.of_01:[00-00-00-00-00-01 1] connected 

Debug:

/usr/bin/python2.7 /home/wirate/pycharm-4.0/helpers/pydev/pydevd.py --multiproc --client 127.0.0.1 --port 49196 --file /home/wirate/pyretic/pyretic.py pyretic.sdx.main 
pydev debugger: process 5555 is connecting 

Connected to pydev debugger (build 139.574) 
Initialize SDX 
SDX: {'_policy': drop, 'notify': None, 'arp_policy': [DynamicPolicy] 
packets 
FwdBucket} 
Creating SDX environment from the config files 
Adding Physical ports for A 
Adding virtual ports for A 
Adding Physical ports for C 
Adding virtual ports for C 
Adding Physical ports for B 
Adding virtual ports for B 
{u'A': {u'A': [1], u'C': [3], u'B': [2]}, u'C': {u'C': [3, 4]}, u'B': {u'B': [2]}} 
{u'A': {u'A': [1], u'C': [3], u'B': [2]}, u'C': {u'A': [1], u'C': [3, 4], u'B': [2]}, u'B': {u'B': [2]}} 
{u'A': {u'A': [1], u'C': [3], u'B': [2]}, u'C': {u'A': [1], u'C': [3, 4], u'B': [2]}, u'B': {u'A': [1], u'C': [3], u'B': [2]}} 
Parsing participant's policies 
Starting VNH Assignment 
After new assignment 
Virtual Next Hop --> IP Prefix: {'VNH1': set([u'110.0.0.0/24', u'100.0.0.0/24']), 'VNH2': set([u'140.0.0.0/24', u'150.0.0.0/24'])} 
Virtual Next Hop --> Next Hop IP Address (Virtual): {'VNH1': '172.0.1.1', 'VNH2': '172.0.1.2', 'VNH': [IPAddress('172.0.1.0'), IPAddress('172.0.1.1'), IPAddress('172.0.1.2'), IPAddress('172.0.1.3'), IPAddress('172.0.1.4'), IPAddress('172.0.1.5'), IPAddress('172.0.1.6'), IPAddress('172.0.1.7'), IPAddress('172.0.1.8'), IPAddress('172.0.1.9'), IPAddress('172.0.1.10'), IPAddress('172.0.1.11'), IPAddress('172.0.1.12'), IPAddress('172.0.1.13'), IPAddress('172.0.1.14'), IPAddress('172.0.1.15')]} 
Virtual Next Hop --> Next Hop Mac Address (Virtual) {'VNH1': aa:00:00:00:00:01, 'VNH2': aa:00:00:00:00:02, 'VNH': 'aa:00:00:00:00:00'} 
Completed VNH Assignment 
pydev debugger: process 5595 is connecting 

POX 0.2.0 (carp)/Copyright 2011-2013 James McCauley, et al. 
POX 0.2.0 (carp)/Copyright 2011-2013 James McCauley, et al. 
Connected to pyretic frontend. 
DEBUG:core:POX 0.2.0 (carp) going up... 
DEBUG:core:Running on CPython (2.7.8/Oct 20 2014 15:05:19) 
DEBUG:core:Platform is Linux-3.16.0-24-generic-x86_64-with-Ubuntu-14.10-utopic 
INFO:core:POX 0.2.0 (carp) is up. 
DEBUG:openflow.of_01:Listening on 0.0.0.0:6633 
INFO:openflow.of_01:[None 1] closed 
INFO:openflow.of_01:[00-00-00-00-00-01 2] connected 

Process finished with exit code 137 

Dies ist der Code, der die Steuerung startet:

def main(): 
    global of_client 
    (op, options, args, kwargs_to_pass) = parseArgs() 
    if options.mode == 'i': 
     options.mode = 'interpreted' 
    elif options.mode == 'r0': 
     options.mode = 'reactive0' 
    elif options.mode == 'p0': 
     options.mode = 'proactive0' 
    elif options.mode == 'p1': 
     options.mode = 'proactive1' 
    try: 
     module_name = args[0] 
    except IndexError: 
     print 'Module must be specified' 
     print '' 
     op.print_usage() 
     sys.exit(1) 
    try: 
     module = import_module(module_name) 
    except ImportError, e: 
     print 'Must be a valid python module' 
     print 'e.g, full module name,' 
     print '  no .py suffix,' 
     print '  located on the system PYTHONPATH' 
     print '' 
     print 'Exception message for ImportError was:' 
     print e 
     sys.exit(1) 

    main = module.main 
    kwargs = { k : v for [k,v] in [ i.lstrip('--').split('=') for i in kwargs_to_pass ]} 

    sys.setrecursionlimit(1500) #INCREASE THIS IF "maximum recursion depth exceeded" 

    # Set up multiprocess logging. 
    verbosity_map = { 'low' : logging.WARNING, 
         'normal' : logging.INFO, 
         'high' : logging.DEBUG, 
         'please-make-it-stop' : logging.DEBUG } 
    logging_queue = Queue() 

    # Make a logging process. 
    def log_writer(queue, log_level): 
     formatter = logging.Formatter('%(levelname)s:%(name)s: %(message)s') 
     handler = logging.StreamHandler() 
     handler.setFormatter(formatter) 
     handler.setLevel(log_level) 
     logger = logging.getLogger() 
     logger.addHandler(handler) 
     logger.setLevel(log_level) 
     while(True): 
      try: 
       to_log = queue.get() 
      except KeyboardInterrupt, e: 
       print "\nkilling log" 
       import sys 
       sys.exit(0) 
      logger.handle(to_log) 
    log_level = verbosity_map.get(options.verbosity, logging.DEBUG) 
    log_process = Process(target=log_writer,args=(logging_queue, log_level,)) 
    log_process.daemon = True 
    log_process.start() 

    # Set default handler. 
    logger = logging.getLogger() 
    handler = util.QueueStreamHandler(logging_queue) 
    logger.addHandler(handler) 
    logger.setLevel(log_level) 

    runtime = Runtime(Backend(),main,kwargs,options.mode,options.verbosity) 
    if not options.frontend_only: 
     try: 
      output = subprocess.check_output('echo $PYTHONPATH',shell=True).strip() 
     except: 
      print 'Error: Unable to obtain PYTHONPATH' 
      sys.exit(1) 
     poxpath = None 
     for p in output.split(':'): 
      if re.match('.*pox/?$',p): 
       poxpath = os.path.abspath(p) 
       break 
     if poxpath is None: 
      print 'Error: pox not found in PYTHONPATH' 
      sys.exit(1) 
     pox_exec = os.path.join(poxpath,'pox.py') 
     python=sys.executable 
     # TODO(josh): pipe pox_client stdout to subprocess.PIPE or 
     # other log file descriptor if necessary 
     of_client = subprocess.Popen([python, 
             pox_exec, 
             '--verbose', 
             'of_client.pox_client' ], 
            stdout=sys.stdout, 
            stderr=subprocess.STDOUT) 

    signal.signal(signal.SIGINT, signal_handler) 
    signal.pause() 

Vielleicht sollte ich füge hinzu, dass ich renne g PyCharm als root, da das Starten des Controllers Privilegien erfordert.

Antwort

0

Ich bin mir nicht sicher über Ihren speziellen Fall. Jedoch für das Debuggen des POX Komponente (in Pycharm), Ich verwende den folgenden Code:

import sys 
sys.path.append('Address_to_POX_folder') 
from pox import boot 

def main(): 
    sys.argv.append(‘Your_POX_Component’) 
    boot.boot() 

if __name__=='__main__': 
    main() 

Wenn ich diesen Code verwenden POX in Pycharm zu laufen, die mininet Schalter verbinden zu POX und die Komponente I verwendet werden ('Your_POX_Component ') und ich kann auch meine Komponente debuggen (pause den Lauf und sehe die variable ...) ohne Probleme.

0

Mein Projekt arbeitete in Debug und fehlgeschlagen in Run. Dies ist mir während der Überarbeitungen mehrmals passiert. Versuchte Lösungen enthalten:

  • PyCharm Neustart
  • Aktualisierung
  • Aktualisierung auf neue PyCharm Installation
  • Clearing-Cache
  • mit einem neuen Projekt beginnen gerade die Python-Dateien
  • usw.

Eine Sache löste die p ein Problem für mich.

  1. Ich ging Menü "Ausführen" -> "Attach to Local Process .."
  2. wählte ich die einzige Option "pydevconsole.py" (auch einige Prozess-IDs den Namen gefolgt).

Das Problem wurde gelöst; Es funktionierte sowohl beim Ausführen als auch beim Debuggen.

Verwandte Themen