从没有附加调试器的PyCharm运行时的Python代码与附加pydev运行时的行为有所不同.
我在PyCharm中运行POX SDN控制器,从控制台运行Mininet模拟,连接POX打开的监听套接字.在调试模式下运行时,一旦Mininet仿真连接到它,POX进程就会完成,而在运行模式下继续按预期工作时不会产生任何错误.这是输出:
跑:
/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
调试:
/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
这是启动控制器的代码:
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()
也许我应该补充一点,我以root身份运行PyCharm,因为启动控制器需要特权.