[英]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.
現在我的問題是
我毫不費力地說,在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.