【问题标题】:Execute shell script using Python?使用 Python 执行 shell 脚本?
【发布时间】:2013-12-24 07:42:24
【问题描述】:

我的 JSON 文档 jsonStr 中有一个 shell 脚本。我试图在反序列化 jsonStr 后使用 Python 子进程模块执行该 shell 脚本 -

#!/usr/bin/python

import subprocess
import json

jsonStr = '{"script":"#!/bin/bash \\n STRING="Hello World" \\n echo $STRING \\n"}'
j = json.loads(jsonStr)

print "start"
subprocess.call(j['script'], shell=True)
print "end"

但不知何故,每当我运行上面的 python 脚本时,我总是会收到这样的错误 -

Traceback (most recent call last):
  File "shellscript", line 27, in <module>
    j = json.loads(jsonStr)
  File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 1 column 34 (char 34)

有什么想法我在这里做错了什么?

【问题讨论】:

    标签: python bash shell subprocess


    【解决方案1】:

    似乎 JSON 解析器被“inside a”混淆了,尤其是在它说 hello world 的地方。

    请注意,只需向 python JSON 库询问正确的字符串即可优雅地获得所有 JSON 转义规则。

    import json
    jsoncnt = {'script':'#!/bin/bash \n STRING="Hello World" \n echo $STRING \n'}
    jsonStr = json.dumps(jsoncnt)
    print jsonStr
    q = json.loads(jsonStr)
    

    【讨论】:

      【解决方案2】:

      错误的 JSON 格式。应该是:

      jsonStr = '{"script":"#!/bin/bash \\n STRING=\\"Hello World\\" \\n echo $STRING \\n"}'
      

      【讨论】:

        【解决方案3】:

        对我来说很好..

        import subprocess
        import json
        
        json_dict = {"script":'#!/bin/bash \\n STRING="Hello World" \\n echo $STRING \\n'}
        
        dump = json.dumps(json_dict)
        
        j = json.loads(dump)
        
        print j
        print j['script']
        
        print "start"
        subprocess.call(j['script'], shell=True)
        print "end"
        

        你能粘贴代码你如何使用 json.dumps()

        结果:

        {u'script': u'#!/bin/bash \\n STRING="Hello World" \\n echo $STRING \\n'}
        #!/bin/bash \n STRING="Hello World" \n echo $STRING \n
        start
        end
        

        【讨论】:

        • 不,不是。请注意,在 OP 的代码中,您的 json_dict 是字符串而不是字典。
        【解决方案4】:

        双引号字符 (") 不允许在 JSON 中使用。您应该将其替换为转义的单引号,如下所示:

        jsonStr = '{"script":"#!/bin/bash \\n STRING=\'Hello World\' \\n echo $STRING \\n"}'
        

        【讨论】: