Есть несколько ошибок.
Первый $url
пуст (возможно, пустая строка в вашем скрипте), что приводит к сбою python при попытке доступа к аргументу.В этом смысл этой ошибки:
URL = sys.argv[1]
IndexError: list index out of range
Затем вы смешиваете код возврата и возвращаемое значение в вашем скрипте:
var=`python test_python_classify.py $url`
if [ $var == 1 ]
then
скрипт python завершает работу с кодом возврата 1, он не print 1. Фактически, ваш скрипт ничего не печатает (следы сбоев переходят на stderr
), поэтому $var
пусто, и вы получаете синтаксическую ошибку оболочки, потому что вы не защитили переменную кавычками.
./pipeline1.sh: line 8: [: ==: unary operator expected
Если вам нужно проверить код возврата, с помощью $?
также отфильтруйте пустые URL-адреса (мой bashржавый, но это должно работать):
if [ ! -z "$url" ]
then
python test_python_classify.py $url
if [ $? == 1 ]
then
Если скрипт Python печатает значение, сначала проверьте код возврата, чтобы убедиться, что оно выполнено успешно, а затем проверьте напечатанное значение
if [ ! -z "$url" ]
then
var = $(python test_python_classify.py $url)
# check if returncode is 0, else there was an error
if [ $? == 0 ]
then
# protecting return with quotes doesn't hurt
if [ "$var" == 1 ]
then
Как предлагается в комментариях, это может использовать основную полную переписку Python, которая упростит все эти проблемы интерфейса bash / python.Что-то (не проверено), например:
import sys,subprocess # we could use python script functions too
with open("url.txt") as f:
for line in f:
url = line.rstrip()
if url:
output = subprocess.check_output([sys.executable,"test_python_classify.py",url])
output = output.decode().strip() # decode & get rid of linefeeds
if output == "1":
print("okay")
subprocess.check_call(["curl","-o","image.png",url])
subprocess.check_call([sys.executable,"description1.py",url])
else:
print("failed: {}: {}".format(url,output))