Проклятия Python не работают с подстановкой команд

Я использовал проект python pick, чтобы выбрать вариант из списка. Ниже код возвращает опцию и индекс.

option, index = pick(options, title)

Pick использует библиотеку curses из Python. Я хочу передать вывод моего скрипта Python в скрипт оболочки.

variable output = $(pythonfile.py)

но он застревает на экране проклятий. Ничего не может нарисовать. Что может быть причиной этого?


person Palash Goel    schedule 27.03.2017    source источник
comment
На самом деле pick использует ncurses (он опирается на метод use_default_colors, если вы включаете multi_select).   -  person Thomas Dickey    schedule 28.03.2017


Ответы (2)


pick застревает, потому что когда вы используете $(pythonfile.py), оболочка перенаправляет вывод pythonfile.py, как если бы это был канал. Кроме того, вывод pick содержит символы для обновления экрана (не то, что вы хотите). Вы можете обойти эти проблемы,

  • перенаправление вывода pythonfile.py на /dev/tty
  • убедиться, что ваш pythonfile.py записывает свой результат в стандартную ошибку, и
  • направление стандартной ошибки в сценарии оболочки на вывод конструкции $(...).

Например:

#!/bin/bash
foo=$(python basic.py 2>&1 >/dev/tty )
echo "result '$foo'"

а в pythonfile.py делаем

import sys

print(option, index, file=sys.stderr)

скорее, чем

print(option, index)
person Thomas Dickey    schedule 28.03.2017
comment
Я нашел обходной путь, сохранив текущий стандартный вывод в новый поток, а затем передав этот поток подпроцессу. Ваш способ сделать это лучше. - person Palash Goel; 29.03.2017

Чтобы передать вывод скрипта Python в переменную Bash, вам нужно указать команду, с помощью которой можно открыть файл python, внутри объявления переменной.

Вот так:

variable_output=$(python pythonfile.py)

Кроме того, если вы хотите передать переменную из Python в bash, вы можете использовать модуль Python sys, а затем перенаправить файл stderr.

Вот так:

test.py

import sys
test_var = (str(3 + 3))
sys.exit(test_var)

тест.ш

test_var=$(python3 test.py 2>&1)
echo $testvar

Теперь, если мы запустим test.sh, мы получим вывод 6.

person Montmons    schedule 27.03.2017