6
votes

Passer des dictionnaires à un script Python via la ligne de commande

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.

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")

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.


0 commentaires

6 Réponses :



0
votes

1 commentaires

On dirait que l'overkill pour passer un dict autour.



8
votes

Avez-vous consulté le Pickle Module pour transmettre les données sur stdout / stdin?

Exemple: p>

knights.py: p> xxx pré>

rond-stable.py: p> xxx pré>

Utilisation et sortie: P>

$ python knights.py | python roundtable.py
The knights say ni.
The knights obtain shrubbery.


0 commentaires

6
votes

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'}


1 commentaires

C'était exactement ce que je cherchais



0
votes

Il suffit d'imprimer le dictionnaire dans un script python xxx

et utilisez-le comme xxx

et maintenant, vous devriez pouvoir accéder au dictionnaire via une variable globale 'dict' dans le deuxième script Python.


0 commentaires

2
votes

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. XXX

EDIT: Voici un exemple légèrement plus impliqué montrant son utilisation avec une simple classe personnalisée: xxx


1 commentaires

ast.literal_eval () peut être trop restrictif. Au lieu d'aucun, il est possible de passer eval () 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 () prend en charge.