2013-10-11 17 views
5

Ich arbeite mit einigen Befehlsausgabe, die als die Zeichenfolge eines Ruby-Hash zurückgegeben wird. (Von etwas, das mcollective genannt wird). HierKonvertieren einer Ruby-Hash-Zeichenfolge in ein Python-Wörterbuch

ist ein Beispiel String Ich erhalte:

{:changes=>{"total"=>0},  :events=>{"failure"=>0, "success"=>0, "total"=>0},  :version=>  {"puppet"=>"2.7.21 (Puppet Enterprise 2.8.1)", "config"=>1381497648},  :time=>  {"filebucket"=>0.000287,  "cron"=>0.00212,  "package"=>0.398982,  "exec"=>0.001314,  "config_retrieval"=>5.60761618614197,  "anchor"=>0.001157,  "service"=>0.774906,  "total"=>9.85111718614197,  "host"=>0.002662,  "user"=>0.063606,  "file"=>2.998467,  "last_run"=>1381497660},  :resources=>  {"skipped"=>6,  "failed_to_restart"=>0,  "out_of_sync"=>0,  "failed"=>0,  "total"=>112,  "restarted"=>0,  "scheduled"=>0,  "changed"=>0}} 

ich fähig bin ein Mini-Parser für diese zu schreiben, aber es wäre eine fiddly Aufgabe sein. Kennt jemand eine Bibliothek oder einen Codeausschnitt, der das für mich in ein Python-Wörterbuch umwandeln könnte?

Wenn Sie denken, ich sollte es nur analysieren, sind alle Tipps willkommen.

+1

Eine schnelle Hack wäre ersetzen Sie einfach => mit: und: [a-z] + mit "\ 1" und dann ast.literal_eval oder json.loads nennen. Das wäre nicht korrekt, da es Zeichenkettenliterale ignoriert, aber es könnte für jetzt gut genug sein. – Antimony

+0

Laut ihrer Dokumentation http://docs.puppetlabs.com/mcollective/reference/basic/basic_cli_usage.html können sie auch JSON: '-j' Flag exportieren. – georg

+0

Nicht in der Version läuft ich leider. Aber ja, das wäre am besten – joeButler

Antwort

4

Eigentlich war es gar nicht so schlecht, etwas zu schreiben, das gut genug für meine Bedürfnisse ist. Nicht das schönste Ding, aber es wird für mich tun.

# Sometimes MCO gives us a ruby hash as a string, We can coerce this into json then into dictionary 
def convert_hash_to_dict(self,ruby_hash): 
    dict_str = ruby_hash.replace(":",'"') # Remove the ruby object key prefix 
    dict_str = dict_str.replace("=>",'" : ') # swap the k => v notation, and close any unshut quotes 
    dict_str = dict_str.replace('""','"') # strip back any double quotes we created to sinlges 
    return json.loads(dict_str) 
3

Haben Sie darüber nachgedacht, Ruby für die Serialisierung zu JSON zu verwenden? Auf diese Weise können Sie es mit der JSON-Bibliothek von Python deinserialisieren.

Wenn das nicht möglich ist, können Sie einen benutzerdefinierten strukturierte Sprache Parser mit relativer Leichtigkeit mit dieser Bibliothek definieren: https://pypi.python.org/pypi/Parsley

6

Sie können es zu JSON leicht umwandeln mit dem folgenden Befehl:

ruby -e 'require "json"; puts JSON.generate({:ruby_hash => "whatever etc..."})' 

Dann Verwenden Sie Pythons JSON-Bibliothek, um sie zu analysieren.

+0

Dies ist eine Möglichkeit, - ich muss dafür sorgen, dass es auf dem System einen Ruby-Interpreter gibt, was nicht immer der Fall ist. – joeButler

Verwandte Themen