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,算是初步成功了。 感觉很无语.......

  • 相关阅读:
    java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header.
    spring-session-data-redis依赖冲突问题
    centos7启动iptables时报Job for iptables.service failed because the control process exited with error cod
    图片上传后台服务报内存溢出 Out Of Memory Java heap space
    mysql 数据库密码忘记重置 进行远程连接
    打Jar包
    Type interface com.innovationV2.mapper.UserMapper is not known to the MapperRegistry
    关于java基础类型Integer String的clone()
    clion使用clang编译
    token & refresh token 机制总结
  • 原文地址:https://www.cnblogs.com/xiami303/p/2773735.html
Copyright © 2011-2022 走看看