python2.7的config parser与django的启动参数argv冲突问题

今天把pycharm的django程序移到wingIDE下面,用自己的config文件,调用另外一个程序员的py文件中的函数。

中间遇到各种问题,首先是import该同学的文件找不到路径,但是物理路径是绝对正确的.  

import core.mixpanelTest as metricsTest

  最后改成:

from core import mixpanelTest

  这样就ok了,是django的bug问题??

   随后是config文件路径

context.APP_PATH = sys.argv[0][0:sys.argv[0].rfind('\\')+1]        

# Parse command-line arguments

parser = argparse.ArgumentParser(description='Http Server', prog='PROG')
parser.add_argument('--port', type = int, default = 8000, help = 'Port to listen on')
parser.add_argument('--conf', type = str, default = context.APP_PATH + 'config\\AppleSauce.conf', help='Config file to parse')
#parser.add_argument('--conf', type = str, default = 'D:\\perforce_workspace\\Projects\\serverteam\\SourceCode\\AppleSauce\\config', help='Config file to parse')
print context.APP_PATH
parser.add_argument('--workernum', type = int, default = 1, help = 'Worker process num')
args = parser.parse_args()
# Command-line arguments
context.LISTEN_PORT = args.port
context.CONFIG_FILE = args.conf
workernum = args.workernum
# Parse config file
config = ConfigParser.ConfigParser()
config.read(context.CONFIG_FILE)

context.MC_NODES = [node for node in str.split(config.get('core', 'MC_NODES'), ',') 
                    if len(node) > 0]

#MySQL setting
DB_HOST = config.get('mysql', 'DB_HOST')
DB_PORT = config.getint('mysql', 'DB_PORT')
DB_DATABASE = config.get('mysql', 'DB_DATABASE')
DB_USER = config.get('mysql', 'DB_USER')
DB_PASSWD = config.get('mysql', 'DB_PASSWD')

# Mixpanel
context.SEPARATOR = config.get('mixpanel', 'SEPARATOR')
context.MONITOR_INTERVAL = config.getint('mixpanel', 'MONITOR_INTERVAL')
context.HBASE_HOST = config.get('mixpanel', 'HBASE_HOST')
context.HBASE_PORT = config.getint('mixpanel', 'HBASE_PORT')
context.HIVE_HOST = config.get('mixpanel', 'HIVE_HOST')
context.HIVE_PORT = config.getint('mixpanel', 'HIVE_PORT')

mc = libmc.Client(context.MC_NODES)

#connect hive
transport_hive = TTransport.TBufferedTransport(TSocket.TSocket(context.HIVE_HOST, context.HIVE_PORT))
protocol_hive = TBinaryProtocol.TBinaryProtocol(transport_hive)
hiveclient = ThriftHive.Client(protocol_hive)
transport_hive.open()

如果是_main_做单元测试,

if __name__ == "__main__":
    try:
        #reStr = {"project":"Test","_event":"UniTest3","by":"","chart_type":"Line","from_date":"2012-11-11","limit":"40","singleOrCompare":"Single","to_date":"2012-11-14","type":"Total","unit_type":"Day","where":""}
        #segmentation(reStr)
	monitorRoutine()   
    except KeyboardInterrupt:
        pass

  config路径要设置成:

parser.add_argument('--conf', type = str, default = context.APP_PATH + '...\\config\\AppleSauce.conf', help='Config file to parse')

  

  如果是django启动的测试,要将config路径设置成:

parser.add_argument('--conf', type = str, default = context.APP_PATH + 'config\\AppleSauce.conf', help='Config file to parse')

  此外,context.APP_PATH  是在context.py中定义的,对应于project的python path路径:

 

这样好了以后,发现能找到同事的py文件了,但是运行到args = parser.parse_args()的时候就开始报错了!

错误如下所示:

看到问题知道是args = parser.parse_args()了问题,django竟然不支持断点调试,只能进入到ConfigParser函数里看一下到底咋回事儿了。(按住ctrl键,鼠标双击函数名。)

整个过程我老大在这帮我调试的,还一边跟我说,编程序必须学断点调试!

 def parse_args(self, args=None, namespace=None):
        args, argv = self.parse_known_args(args, namespace)
        if argv:
            msg = _('unrecognized arguments: %s')
            self.error(msg % ' '.join(argv))
        return args

  一看报不识别的参数错误,就是这里。 也就是说argv不是None,才报的这个错误。打印一下args和argv到底是啥?突然发现,我需要读的是config文件的字段,这里却提示runserver参数无效。

好像把我启动程序的runserver也给写进argc里去了!django的启动程序代码里是有argv的!

manage.py文件代码如下:

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "AppleSauce.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

  

def parse_args(self, args=None, namespace=None):
        args, argv = self.parse_known_args(args, namespace)
        print args, argv
        if argv:
            msg = _('unrecognized arguments: %s')
            self.error(msg % ' '.join(argv))
        return args

  

老大打印出的结果显示如下:

果然和预期想的一样,argv把我的参数写进去了,不是None。

 

老大改动如下,非常粗鲁,但是见效。把python库的argparse.py 里的parse_args改成下面的样子,强制改argv为None啊!

 def parse_args(self, args=None, namespace=None):
        args, argv = self.parse_known_args(args, namespace)
        argv = None
        if argv:
            msg = _('unrecognized arguments: %s')
            self.error(msg % ' '.join(argv))
        return args

  

ok,算是初步成功了。 感觉很无语.......

posted @ 2012-11-16 18:04  小侠女  阅读(1498)  评论(0编辑  收藏  举报