我正在努力实现以下目标:
-
我有一个python脚本,它调用一个shell脚本并传递一个参数。Shell脚本使用在某个位置传递的参数创建一个tar.gz文件。
-
现在,shell脚本应该传递这样创建的tar.gz的名称和位置。Python脚本使用它来形成JSON并传递给其他代码。
-
除此之外,我还想添加一些检查,以确保如果生成了tar.gz,则只向python返回值,否则不会。
这是代码:
Python脚本:
#!/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
shell脚本:
#!/bin/bash
if [ "$1" != "" ]; then
uid=$1
echo "Positional parameter 1 contains something $1"
else
echo "Positional parameter 1 is empty"
fi
LOG_TMP="tmp_log_file_location"
log_location="log_file_location"
filename="${log_location}/$uid.tar.gz"
echo $filename
tar -zcvf $filename -C $LOG_TMP/dc .
这是我无法理解的:
- 如果tar-zcvf命令成功,如何将变量"filename"的值传回python脚本
- 在python脚本中,我如何验证文件名的取值并使用该值创建JSON
- 在无法生成值的情况下,STATUS在JSON中(在python中)会失败,所以也要捕获它
您的shell脚本将生成的文件的名称写入标准输出,因此您的问题归结为如何捕获从Python启动的子进程的stdandard输出。这已经在这里回答了。顺便说一句,当询问有关Python的问题时,最好始终指定您正在使用的Python版本。
然而,在您的情况下,我会重新设计一下您的shell脚本:
脚本不仅输出生成的文件名,还输出关于"位置参数"的消息,这意味着无论是消息还是有效输出,都必须在脚本中将它们分开。您可以将消息发送到标准错误,以将它们分开。
顺便说一句,如果没有位置参数,则生成的文件名仅为.tar.gz
。这真的是你想要的吗?如果没有参数,做一个exit 1
不是更好吗?