2017-10-01 7 views
0

Je crée un script qui écrit un autre script, les arguments sont passés en JSON lors de l'appel du script à partir du terminal.comment passer directement le nom de la variable en tant que clé dict avec json.loads en python?

Le script qui doit être écrit contient un dictionnaire. L'une des valeurs clés de cette dict est une stratégie d'appel de nom de variable (pas une chaîne de caractères).

Mon problème ressemble à ceci. L'exécution du script renvoie une erreur qui disparaît si j'ai défini une valeur de clé de stratégie en tant que chaîne.

Erreur:

Traceback (most recent call last): 
    File "updateCandleStrategy.py", line 11, in <module> 
    d = json.loads(sys.argv[2]) 
    File "/usr/lib/python3.4/json/__init__.py", line 318, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib/python3.4/json/decoder.py", line 343, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/usr/lib/python3.4/json/decoder.py", line 361, in raw_decode 
    raise ValueError(errmsg("Expecting value", s, err.value)) from None 
ValueError: Expecting value: line 1 column 506 (char 505) 

est-il un moyen simple pour atteindre mon objectif?

Merci

+1

Comment vous attendez-vous à transmettre un _string_ JSON contenant une variable via la ligne cmd? –

Répondre

1

lors du passage d'une chaîne json de la ligne de commande, il y a une grande chance que l'une des citations/évasion omble chevalier est interprété par la coque sous-jacente.

Donc ce n'est pas une méthode viable/fiable pour passer les chaînes json. Passez un fichier contenant des données JSON au lieu et le lire:

with open(sys.argv[2]) as f: 
    d = json.load(f) 

Exemple de console Windows, juste l'impression deuxième argument:

S:\python>foo.py ff "d = {"s":12,"d":15}" 
d = {s:12,d:15} 

les citations ont été supprimées. Aurait besoin de les doubler.

Sur un terminal Linux, enroulant vos arguments dans des guillemets simples pourrait résoudre la plupart des situations, cependant, jusqu'à ce que vous tombez sur une valeur contenant un guillemet simple ...

Au lieu de passer un dictionnaire, pourquoi ne pas utiliser ou getoptargparse et construire/analyser une ligne de commande correcte?

+0

merci, va essayer. J'ai trouvé un changement jusqu'à présent en manipulant la chaîne et en remplaçant la "stratégie" par la stratégie mais je pensais que quelque chose d'autre pouvait être plus élégant –

+0

voir mon édition, une analyse en ligne de commande standard pourrait être OK pour un nombre relativement faible de données . –