Comment passer dictionnaire comme argument de ligne de commande à un script python?
Comment passer dictionnaire comme argument de ligne de commande à un script python ?
J'ai besoin d'obtenir de dictionnaire où la clé est la chaîne de la valeur et de la liste de certains éléments
( par exemple pour ressembler à :
command_line_arguments = {"names" : ["J.J.", "April"], "years" : [25, 29]}
J'ai essayé comme
if __name__ == '__main__':
args = dict([arg.split('=') for arg in sys.argv[2:]]) # also tried with 1 but doesn't work
main(args)
et je suis l'appel de script comme
$ python saver.py names=["J.J.", "April"] years=[25, 29]
mais ça ne fonctionne pas, le dictionnaire est de longueur 0 et 2. Quelqu'un peut-il m'aider à passer et à créer le dictionnaire principal.
Vous devez vous connecter pour publier un commentaire.
La chose importante à noter ici est que, à la ligne de commande, vous ne pouvez pas passer à python d'objets comme arguments. Le shell en cours vous utilisez analyser les arguments et de les transmettre en fonction de son propre argument règles d'analyse.
Cela étant dit, vous ne pouvez pas passer dans un dictionnaire python. Cependant, des choses comme JSON peut vous permettre d'obtenir sacrément proche.
JSON JavaScript, l'Objet de la Représentation est un moyen de prendre des objets Python et de les convertir en une chaîne comme la représentation, adapté pour les passer autour de plusieurs langues. Cela étant dit, vous pourriez passer dans une chaîne de caractères comme ceci:
Dans votre script python, ce faire:
Cela va vous redonner un dictionnaire représentant les données que vous avez voulu passer en.
De même, vous pouvez prendre un dictionnaire python et à la convertir en une chaîne de caractères:
Il existe d'autres méthodes pour arriver à ce résultat, bien que JSON est assez universelle. L'important à retenir est que, indépendamment de la façon dont vous le faites - vous ne serez pas en passant le dictionnaire en Python, - vous serez de passage dans un ensemble d'arguments (qui vont tous être des chaînes de caractères) que vous devez en quelque sorte se convertir en python type dont vous avez besoin.
@EvanZamir - à noter que (généralement) dans un shell, vous avez besoin d'échapper les guillemets si elles apparaissent dans votre chaîne de caractères entre guillemets. Dans mon exemple, je cite les données JSON avec des guillemets simples, et la chaîne json lui-même utilise des guillemets, ce qui évite la nécessité pour les citations.
Si vous mélangez les citations (d'utiliser des guillemets pour citer l'argument, et les guillemets à l'intérieur), puis la coque devra être échappé, sinon le premier guillemet double il rencontre est considéré comme le "cours de clôture" pour l'argument. Remarque: dans l'exemple, j'utilise guillemets simples pour joindre la chaîne JSON, et guillemets au sein de la chaîne. Si j'ai utilisé des guillemets simples dans la chaîne, j'aurais besoin d'échapper à l'aide d'une barre oblique inverse, c'est à dire:
ou
Note le citant des choses est une fonction de votre coquille, de sorte YMMV peut varier (par exemple, si vous utilisez une méthode exec pour appeler le script, échappant pourrait ne pas être nécessaire puisque le shell bash peut pas être invoquée.)
[filename,names',"J.J.", "April", 'years',25,29]
--names "{\"names\": [\"J.J.\", \"April\"], \"years\": [25, 29]}"
Voici une autre méthode à l'aide de stdin. C'est la méthode que vous voulez pour un json de l'interface cgi (c'est à dire avoir un serveur web transmet la demande à votre script):
Python:
Pour tester votre script à partir d'un terminal Linux:
Pour tester votre script à partir d'un terminal server de Windows: