Возвращаемое значение к сценарию Python от оболочки

Я пытаюсь возвратить строку от сценария оболочки до Python, добираясь ниже ошибки.

./whiptail.sh: 10: return: Illegal number: uuiiu

я пытался выполнить команду whiptail в рамках Python непосредственно с помощью подпроцесса. Popen даже в той точке я не могу считать ввод данных пользователем из Python.. Если кто-либо попробовал, это сообщило мне, как решить эту проблему.

отрывок сценария оболочки

#!/bin/sh


COLOR=$(whiptail --inputbox "What is your favorite Color?" 8 78 Blue --title "Example Dialog" 3>&1 1>&2 2>&3)
                                                                        # A trick to swap stdout and stderr.
# Again, you can pack this inside if, but it seems really long for some 80-col terminal users.
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "User selected Ok and entered " $COLOR
    return $COLOR
else
    echo "User selected Cancel."
fi

echo "(Exit status was $exitstatus)"
2
задан 12 February 2020 в 14:56

2 ответа

В sh который является на самом деле dash на Ubuntu встроенная команда return могут возвраты только численные значения - статусы выхода, которые имеют значение в контексте функции или полученного сценария. Источник man sh:

Синтаксис команды возврата

return [exitstatus]

Все прочие с Вашим сценарием оболочки выглядит корректным. Я думаю, что необходимо использовать echo $COLOR вместо этого возвратите и подавите другое эхо.

В случае, если необходимо возвратить больше данных основному сценарию, можно произвести все как одну строку и разделить отдельные поля на некоторый символ, который будет играть роль разделителя в основном сценарии, на которой основе можно преобразовать строку в массив. Например (где , наш разделитель и -n будут ужины символ новой строки в echo):

echo -n "$COLOR","$exitstatus"

Другая информация, которая предоставляется сценарием и не требуется основным сценарием, могла быть перенаправлена к некоторому файлу журнала:

$ cat whiptail.sh
#!/bin/sh
log_file='/tmp/my.log'

COLOR=$(whiptail --inputbox "What is your favorite Color?" 8 78 Blue --title "Example Dialog" 3>&1 1>&2 2>&3)
exitstatus=$?

if [ $exitstatus = 0 ]; then
    echo "User selected Ok and entered $COLOR" > "$log_file"
    echo -n "$COLOR","$exitstatus"
else
    echo "User selected Cancel."  >> "$log_file"
    echo -n "CANCEL","$exitstatus"
fi

К сожалению, у меня нет большого опыта с Python, но вот является образец .py сценарием, который может обработать вывод вышеупомянутого .sh сценарий (ссылка):

$ cat main-script.py
#!/usr/bin/python
import subprocess

p = subprocess.Popen(['./whiptail.sh'], stdout=subprocess.PIPE)
p = p.communicate()[0]
p = p.split(",")
print "Color:    " + p[0]
print "ExitCode: " + p[1]
5
ответ дан 20 February 2020 в 22:55

У меня была аналогичная проблема, когда мне нужно было возвращаемое значение из команды оболочки в моем скрипте Python.

Метод подпроцесса check_output() помог мне получить код возврата оболочки в виде строки байтов в файле Python.

Вот код:

return_value =subprocess.check_output("sudo raspi-config nonint get_spi", stderr=subprocess.STDOUT, shell = True)
print(return_value)


<<<b'1\n'
0
ответ дан 8 December 2020 в 16:41

Другие вопросы по тегам:

Похожие вопросы: