如何在数据库上使用python ArgumentParser?

时间:2018-01-08 00:45:37

标签: python databricks

我想通过使用ArgumentParser传递一些参数来运行我的python代码,解析器代码如下:

def parse_args(argv):
    global Settings, COST_PP, COST_BP, COST_NP, COST_PN, COST_BN, COST_NN

    desc = "..."
    parser = argparse.ArgumentParser(description=desc)

   parser.add_argument("infile", action="store")
   parser.add_argument("-o", "--outfile", action="store", dest="outfile")
   args = parser.parse_args(argv)


def main():
    global Settings

    parse_args(sys.argv[1:])

    print("\t".join(sys.argv[1:]))
    logging.info("SETTINGS:")
    for k, v in Settings.items():
       logging.info("\t\t" + str(k) + ":\t" + str(v)) ...

if __name__ == '__main__':
    main()

但是我收到了这样的错误:

usage: PythonShell.py [-h] [-o OUTFILE] [-alg ALGORITHM] [-cL CLASS_LIST]
                  [-n RUNS] [-tf TRAIN_FRAC] [-cs COST_SET]
                  [-ms MULT_STRAT] [--log LOG_FILE] [-d]
                  infile
PythonShell.py: error: unrecognized arguments: 0 50000 1916 
a91f477cb4de44dfa5d1f3dd01f8f606 2.2.0
To exit: use 'exit', 'quit', or Ctrl-D.

我想知道如何在databricks笔记本中正确运行代码?感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

我遇到了类似的问题。即使我尝试运行the documentation的最基本示例。但是您可以通过两种方式在数据块中运行参数解析器:

  1. 在数组中传递参数:

    import argparse
    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('integers', metavar='N', type=int, nargs='+',
                        help='an integer for the accumulator')
    parser.add_argument('--sum', dest='accumulate', action='store_const',
                        const=sum, default=max,
                        help='sum the integers (default: find the max)')
    ## normally you can now do: parser.parse_args(), instead do this:
    parser.parse_args(['23', '35'])
    
  2. 将代码放在单独的笔记本中,并使用%run命令从当前笔记本中运行该笔记本。 here

  3. 说明

答案 1 :(得分:0)

我发现将参数从Azure数据工厂传递给Databricks Python脚本/作业的唯一方法是使用shlex:

    import argparse, shlex
    parser = argparse.ArgumentParser()
    parser.add_argument('--arg1', type=str, required=True)
    parser.add_argument('--arg2', type=str, required=True)
    args = parser.parse_args(shlex.split(" ".join(sys.argv[1:])))

Databicks将参数传递为:[“ script”,“ --arg1 val”,“ --arg1 val”] 而argparse期望将参数名称和值分割开:[“ script”,“-arg1”,“ val”,“-arg1”,“ val”]。

我们首先将所有参数连接为一个字符串,然后使用shlex对其进行拆分,以获取正确的列表以传递给parse_args。