从shell脚本返回值到python脚本

时间:2016-05-09 19:07:40

标签: python json linux bash shell

我正在努力实现以下目标:

  1. 我有一个python脚本,它调用一个shell脚本并传递一个参数。 Shell脚本使用在某个位置传递的参数创建tar.gz文件。

  2. 现在shell脚本应该传递如此创建的tar.gz的名称和位置。 Python脚本使用它来形成JSON并传递给其他代码。

  3. 除此之外,我想添加一些检查以确保是否生成tar.gz然后只将值返回给python,否则不返回。

  4. 以下是代码:

    Python脚本:

    Frame

    shell脚本:

    #!/usr/bin/python
    
    import json
    import subprocess
    
    json_data='{"name": "StackOverflow", "uid": "8fa36334-ce51"}'
    
    data = json.loads(json_data)
    for keys,values in data.items():
      print(keys)
      print(values)
    
     UID = data.get('uid')
    
     rc = subprocess.check_output(["/home/cyc/Cyc-    
            Repo/cyc_core/cyc_platform/src/package/cyc_bsc/scripts/test.sh",    
            UID])
     print rc
     if rc != 0:
       print "failed for passed in uid"
    
    data_op = {}
    data_op['pathTOCompressfile'] = 'value_should_be_return_from_shell'
    data_op['status'] = 'OK'
    json_data_op = json.dumps(data_op)
    
    print json_data_op
    

    这是我无法理解的:

    1. 如何传回变量" filename"的值如果tar -zcvf命令成功,则回到python脚本。
    2. 在python脚本中,我如何验证获取文件名的值并使用
    3. 创建JSON
    4. 如果无法生成值,则STATUS在JSON中失败(在python中),因此也可以捕获它。

1 个答案:

答案 0 :(得分:0)

您的shell脚本将生成的文件的名称写入标准输出,因此您的问题归结为如何捕获从Python启动的子进程的标准输出。这已被批准here。顺便说一句,在询问有关Python的问题时,总是指定您正在使用的Python版本是个好主意。

但是,在你的情况下,我会稍微重新设计你的shell脚本:

您的脚本不仅会输出生成的文件名,还会输出有关"位置参数"的消息,这意味着您必须在脚本中将它们分开,无论是消息还是有效输出。您可以将消息发送到标准错误,以使它们分开。

顺便说一句,如果没有位置参数,生成的文件名只是.tar.gz。这真的是你想拥有的吗?如果没有参数,那么做exit 1会不会更好?