Comment passer un dictionnaire à un script Python à partir d'un autre script Python sur la ligne de commande? J'utilise le sous-processus pour appeler le deuxième script. p>
Les options que j'ai viennent sont:
I) Construire un module pour analyser un dictionnaire d'une chaîne (plus en profondeur que j'avais espéré aller).
Ii) Utilisez un fichier temporaire pour écrire un cornichon et transmettre le nom du fichier sous forme d'argument de
Iii) Ne pas autoriser les dictionnaires, mais gérer les paires de la clé / de la valeur (qui est "Prog.py Keya Valuea Keyb Valub") P>
La solution ne doit pas nécessairement être conviviale, mais elle doit être amicale. Le deuxième programme doit être exécuté en tant que processus distinct, en raison de problèmes de sécurité et de ressources. P>
6 Réponses :
Si vous n'avez pas besoin d'une structure de données trop compliquée, puis-je recommander SimpleJson A >? Il est disponible sous forme de module intégré (appelé JSON code>) dans Python 2.6 et ultérieur. P>
Oui, vous pouvez transmettre le dictionnaire sérialisé JSON en l'écrivant au STDIN du deuxième script.
+1 Parce que JSON est simple, efficace et presque identique à la structure dict code> de Python.
+1 Parce que c'est parfait, bien que la réponse de Fogglebird soit parfaite, et je ne peux pas parler au patron dans quoi que ce soit qui traite avec JavaScript
Que diriez-vous de XMLRPC? P>
client http://docs.python.org/library/xmlrpclib.html P >
serveur http://docs.python.org/library/simplexmlrpcserver.html P >
Les deux sont dans le noyau Python. P>
On dirait que l'overkill pour passer un dict code> autour.
Avez-vous consulté le Pickle Module pour transmettre les données sur stdout / stdin?
Exemple: p>
knights.py: p> rond-stable.py: p> Utilisation et sortie: P> $ python knights.py | python roundtable.py
The knights say ni.
The knights obtain shrubbery.
Mis à part cornichon code>, une autre option est
ast.literal_eval code>, si vos dictionnaires ne contiennent que des primitives Python.
>>> d = {3: 9, 'apple': 'orange'}
>>> s = str(d)
>>> s
"{3: 9, 'apple': 'orange'}"
>>> import ast
>>> x = ast.literal_eval(s)
>>> x
{3: 9, 'apple': 'orange'}
C'était exactement ce que je cherchais
Il suffit d'imprimer le dictionnaire dans un script python et utilisez-le comme p> et maintenant, vous devriez pouvoir accéder au dictionnaire via une variable globale 'dict' dans le deuxième script Python. P> p>
Si ce qui est dans le dictionnaire (les deux clés et les valeurs) peut être représenté comme des chaînes, vous devriez pouvoir le transmettre comme un argument de chaîne sur le second script qui peut le recréer. EDIT: strong> Voici un exemple légèrement plus impliqué montrant son utilisation avec une simple classe personnalisée: p>
ast.literal_eval () code> peut être trop restrictif. Au lieu d'aucun, il est possible de passer
eval () code> un deuxième argument qui correspond à un dictionnaire de mappage des noms de classe personnalisés aux classes personnalisées correspondantes qui, lorsqu'elles sont fournies, permettraient de reconstituer des instances d'être reconstituées. Aux cordes, chiffres, tuples, listes, dicts, booléens et aucun type de valeur que
ast.literal_eval () code> prend en charge.