在json-fi中处理Python程序参数

2024-10-01 13:44:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个Python新手。我想对处理程序参数的建议是在一个文件中的json格式。目前,我正在做如下所示的事情,然而,它似乎过于冗长,并且多次输入同一个字符串(有时用破折号,有时用下划线)的想法似乎是幼稚的-容易出错的-糟糕的。。。:—)(我还有很多参数!)在

#!/usr/bin/env python
import sys
import os
import json                 ## for control file parsing

# control parameters
mpi_nodes = 1
cluster_size = None
initial_cutoff = None
# ...

#process the arguments
if len(sys.argv) != 2:
    raise Exception(
        """Usage:
                run_foo <controls.json>
            Where:
                <control.json> is a dictionary of run parameters
        """
    )

# We expect a .json file with our parameters
controlsFileName = sys.argv[1]
err = ""
err += "" #validateFileArgument(controlsFileName, exists=True)

# read in the control parameters from the .json file
try:
    controls = json.load(open(controlsFileName, "r"))
except:
    err +=  "Could not process the file '" + controlsFileName + "'!\n"

# check each control parameter. The first one is optional
if "mpi-nodes" in controls:
    mpi_nodes = controls["mpi-nodes"]
else:
    mpi_nodes = controls["mpi-nodes"] = 1

if "cluster-size" in controls:
    cluster_size = controls["cluster-size"]
else:
    err += "Missing control definition for \"cluster-size\".\n"

if "initial-cutoff" in controls:
    initial_cutoff = controls["initial-cutoff"]
else:
    err += "Missing control definition for \"initial-cutoff\".\n"

# ...

# Quit if any of these things were not true
if len(err) > 0:
    print err
    exit()

#...

这是可行的,但似乎有更好的方法。我被要求使用json文件和使用连字符的参数名。有什么想法吗?在

我在找更具静态绑定的东西。也许这是最好的。在


Tags: thejsonsizeifcontrolinitialfilecutoff
3条回答

通常,我们会这样做。在

def get_parameters( some_file_name ):
    source= json.loads( some_file_name )
    return dict(
        mpi_nodes= source.get('mpi-nodes',1),
        cluster_size= source['cluster-size'],
        initial_cutoff = source['initial-cutoff'],
    )

 controlsFileName= sys.argv[1]
 try:
     params = get_parameters( controlsFileName )
 except IOError:
     print "Could not process the file '{0}'!".format( controlsFileName )
     sys.exit( 1 )
 except KeyError, e:
     print "Missing control definition for '{0}'.".format( e.message )
     sys.exit( 2 )

A endparams['mpi_nodes']的值为mpi\u nodes

如果你想要一个简单的变量,你可以这样做。mpi_nodes = params['mpi_nodes']

如果您需要namedtuple,请将get_parameters更改为

^{pr2}$

我不知道你会不会觉得更好。在

argparse库很不错,它可以为您处理大部分参数解析和验证,以及打印漂亮的帮助屏幕

[1]http://docs.python.org/dev/library/argparse.html

我将制作一个快速演示,展示你如何使用它这个阿沃。在

假设您有更多的参数要处理,类似这样的方法可能会起作用:

def underscore(s):
  return s.replace('-','_')

# parameters with default values
for name, default in (("mpi-nodes", 1),):
  globals()[underscore(name)] = controls.get(name, default)

# mandatory parameters
for name in ("cluster-size", "initial-cutoff"):
  try:
    globals()[underscore(name)] = controls[name]
  except KeyError:
    err += "Missing control definition for %r" % name

您也可以使其更显式,而不是操纵全局变量:

^{pr2}$

相关问题 更多 >