zoukankan      html  css  js  c++  java
  • 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,算是初步成功了。 感觉很无语.......

  • 相关阅读:
    linux服务器NAT后无法在内网通过外部IP访问内部服务的问题
    Centos7离线部署docker
    centos7运维记录文档
    centos7离线部署Patroni
    nginx常用运维日志分析命令
    Ubuntu只读文件系统修复方法
    pm2常用命令
    Expert 诊断优化系列------------------锁是个大角色
    Expert 诊断优化系列------------------给TempDB 降温
    Expert 诊断优化系列------------------透过等待看系统
  • 原文地址:https://www.cnblogs.com/xiami303/p/2773735.html
Copyright © 2011-2022 走看看