2013-10-11 29 views
5

Rubyハッシュの文字列として返されるコマンド出力を使っています。 (mcollectiveと呼ばれるものから)。ここで Rubyハッシュ文字列をPython辞書に変換する

は、私が受けてる例の文字列です:

{: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}} 

私はこのためのミニパーサを書き込むことができるんだけど、それは手間のかかる作業です。誰かが私のためにこれをPython辞書に変換できるライブラリまたはコードスニペットを知っていますか?

私はそれを解析する必要があると思うなら、あらゆるヒントを歓迎します。

+1

迅速なハックだけで=>を置き換えるために、次のようになりますと:[-Z] + "\ 1" とし、その後ast.literal_evalまたはjson.loadsを呼び出します。それは文字列リテラルを無視するので正しくないでしょうが、今のところ十分かもしれません。 – Antimony

+0

彼らのドキュメントhttp://docs.puppetlabs.com/mcollective/reference/basic/basic_cli_usage.htmlによると、JSON: '-j'フラグもエクスポートできます。 – georg

+0

残念ながら実行中のバージョンではありません。しかし、ええそれは最高だ – joeButler

答えて

4

実際、私のニーズに合ったものを書くのはあまりにも悪くありませんでした。一番美しいものではありませんが、それは私のためになります。

# 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

これをJSONにシリアル化するためにRubyを使用することを検討しましたか?そうすれば、PythonのJSONライブラリで逆シリアル化できます。

それはオプションではない場合、あなたはこのライブラリを使用して比較的簡単にカスタム構造化言語パーサを定義することができます。https://pypi.python.org/pypi/Parsley

6

あなたは簡単に次のコマンドを使用してJSONに変換することができます。そして、

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

PythonのJSONライブラリを使用して解析します。

+0

を参照してください。これは可能です。システムにルビーインタプリタが必ず必要というわけではありません。 – joeButler

関連する問題