簡體   English   中英

如何為Python腳本有效地將bash shell腳本存儲在JSON文檔中

[英]How to store bash shell script in the JSON document effectively for Python script

我正在與bash shell腳本一起使用Python。 我有一個單獨的程序,它將bash shell腳本存儲在JSON文檔中(在zookeeper節點中),並且該JSON文檔看起來像這樣-

{"script":"#!/bin/bash\\necho Hello world 1\\n"}

現在,從我的Python程序中,我需要閱讀上面的JSON文檔(從zookeeper節點),然后提取其中的script部分,然后執行Shell腳本。

如您在我上面的json字符串中看到的那樣,我需要以某種方式存儲我的bash shell腳本,以便在從Python腳本中的JSON字符串中檢索數據時可以成功執行它。

含義是,我需要轉義某些內容,並在bash shell腳本的JSON字符串中添加\\\\n ,以使其起作用。

現在,從Python腳本中,我可以簡單地做到這一點-

jsonStr = '{"script":"#!/bin/bash\\necho Hello world 1\\n"}' # get it from zookeeper
j = json.loads(jsonStr)

shell_script = j['script']

print "start"
proc = subprocess.Popen(shell_script, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = proc.communicate()
if stderr:
   print "Shell script gave some error"
   print stderr
else:
   print stdout
   print "end" # Shell script ran fine.

現在我的問題是

  1. 我如何以這種方式在JSON字符串中構建bash shell腳本,從而無需用其他用Java編寫的程序將其存儲在zookeeper節點中,也無需付出額外的努力。
  2. 而且,通過從Python程序的JSON字符串中提取shell腳本來執行shell腳本時,也無需付出額外的努力。

我毫不費力地說,在JSON文檔中存儲big bash shell腳本的最佳方法是什么? 以及如何從Python腳本輕松執行它?

我可能還有大約60-70行shell腳本。

更新: -

我是這樣從Zookeeper獲得JSON文檔的-

data, stat = zk.get(node)
jsonString = data.decode("utf-8")
jStr = json.loads(jsonString)
shell_script = j['script']

我正在使用Python中的Zookeeper的Kazoo API。 這是方法-

http://kazoo.readthedocs.org/en/latest/api/client.html#kazoo.client.KazooClient.get

然后,如何在JSON文檔中將該外殼腳本表示為外殼腳本。下面的外殼腳本接受Python程序中的某些參數。 我的Python程序中有這些參數,並且正在通過os.env發送

#!/bin/bash

hello=$jj1

echo $hello

echo $jj1
echo $jj2

for el1 in $jj3
do
    echo "$el1"
done

for el2 in $jj4
do
    echo "$el2"
done

for i in $( ls ); do
    echo item: $i
done

這樣我就可以從Python腳本成功執行它了?

這就是我的表示方式,我將從Java程序將此JSON字符串直接寫入Zookeeper節點-

{"script":"#!/bin/bash \n hello=$jj1 \n echo $hello \n echo $jj1 \n echo $jj2 \n for el1 in $jj3 \n do \n echo "$el1" \n done \n for el2 in $jj4 \n do \n   echo "$el2" \n done \n for i in $( ls ); do \n echo item: $i \n done"}

當我在命令下運行時-

   jsonStr = '{"script":"#!/bin/bash hello=$jj1 echo $hello echo $jj1 echo $jj2 for el1 in $jj3 do echo \"$el1\" done for el2 in $jj4 do echo \"$el2\" done for i in $( ls ); do echo item: $i done"}'

print repr(jsonStr)

這已在控制台上打印出來-

'{"script":"#!/bin/bash hello=$jj1 echo $hello echo $jj1 echo $jj2 for el1 in $jj3 do echo "$el1" done for el2 in $jj4 do echo "$el2" done for i in $( ls ); do echo item: $i done"}'

這是有效的JSON字符串。

使用json

json.encoder.encode_basestring_ascii('{"script":"#!/bin/bash\\necho Hello world 1\\n}')

如果恢復到您的問題的較早版本,而在json文檔中正確使用\\n而不是\\\\n無需執行任何操作 這是一個例子

當您將json文檔指定為Python字符串文字(在這種情況下不需要(也不應該這樣做))時,可能會被雙重轉義感到困惑。

data在json字符串中包含文字換行符。 無效的json。 沒有json生成器會生成此類文本。 不要在Java代碼中手動生成json文本,而應使用任何json庫。

您的最新示例在json字符串中包含未轉義的引號。 使其無效json。 更換

"a "$b" c"

類似的字符串

"a \"$b\" c"

json字符串。 print repr(json_string)看起來像:

'"a \\"$b\\" c"'

即,斜杠是兩次轉義的。 除非您要使用Python字符串文字指定json字符串,否則請不要兩次轉義。 意思是,如果您的json來自zookeeper,則不應該這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM