从没有附加调试器的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,因为启动控制器需要特权。
答案 0 :(得分:0)
我不确定你的具体情况。但是,为了调试POX
组件(在Pycharm
中),我使用以下代码:
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()
当我使用此代码在POX
中运行Pycharm
时,mininet
开关连接到POX
和我使用的组件('Your_POX_Component'),我也可以调试我的组件(暂停运行并查看variable
...)没有任何问题。
答案 1 :(得分:0)
我的项目在Debug中工作,在Run中失败。在修订期间,我多次发生这种情况。 尝试过的解决方案包括:
有一件事让我解决了这个问题。
问题解决了;它在运行和调试中都有效。
答案 2 :(得分:0)
检查你看的表情! 如果你正在评估一些可调用的(函数),它可能会在调试过程中影响执行结果。
例如,您观看像
这样的语句array.sort()
虽然这不是程序代码的一部分。在调试过程中,这个 watch 将被调用,你的列表将被排序,尽管你没有在你的主程序中进行任何排序。最后你可能会得到意想不到的结果和执行中的执行之间的差异