Как выполнить эту команду оболочки из Python?

Итак, у меня есть этот нефункциональный скрипт оболочки, который я переписываю по частям в python, за исключением того, что я получаю «неожиданную» ошибку «из оболочки» (см. Ниже):

#/bin/sh LINES=`cat $@ | wc -l` for i in `seq 1 $lines`; do head -n $i $@ | tail -n 1 | text2wave -o temp.wav sox "otherstuff.wav" "temp.wav" "silence.wav" "output.wav" mv output.wav otherstuff.wav rm -rf temp.wav done 

На практике это практически невозможно. Но если я знаю количество строк в файле, я могу запустить его в определенном файле в TTS весь файл и вставить 10 секунд молчания между каждой строкой, потому что я не должен сказать

 LINES=`cat $@ | wc -l` 

В интересах управления потоком и способа включения счетчика строк в скрипт, который я могу использовать повсюду, я собираюсь использовать Python для выполнения этой задачи. Пока у меня есть этот фрагмент, также нефункциональный:

 import linecache, os for i in range(linelength): lineone = linecache.getline(filename, i) os.system("echo " + lineone + "|" + "festival --tts") 

который дает эту ошибку в интерпретаторе IPython :

 d 68. sh: 2: Syntax error: "|" unexpected Out[60]: 512 d 67. sh: 2: Syntax error: "|" unexpected Out[60]: 512 c 52. sh: 2: Syntax error: "|" unexpected Out[60]: 512 c 42. sh: 2: Syntax error: "|" unexpected Out[60]: 512 c 71. sh: 2: Syntax error: "|" unexpected Out[60]: 512 c 51. sh: 2: Syntax error: "|" unexpected Out[60]: 512 c 19. sh: 2: Syntax error: "|" unexpected Out[60]: 512 c 18. sh: 2: Syntax error: "|" unexpected Out[60]: 512 b 16. sh: 2: Syntax error: "|" unexpected Out[60]: 512 b 15. sh: 2: Syntax error: "|" unexpected Out[60]: 512 b 1. sh: 2: Syntax error: "|" unexpected Out[60]: 512 d 16. sh: 2: Syntax error: "|" unexpected Out[60]: 512 d 14. sh: 2: Syntax error: "|" unexpected Out[60]: 512 a 96. sh: 2: Syntax error: "|" unexpected Out[60]: 512 a 95. sh: 2: Syntax error: "|" unexpected Out[60]: 512 a 35. sh: 2: Syntax error: "|" unexpected Out[60]: 512 a 25. sh: 2: Syntax error: "|" unexpected Out[60]: 512 d 74. sh: 2: Syntax error: "|" unexpected Out[60]: 512 d 83. sh: 2: Syntax error: "|" unexpected Out[60]: 512 a 9. sh: 2: Syntax error: "|" unexpected Out[60]: 512 d 9. sh: 2: Syntax error: "|" unexpected Out[60]: 512 b 97. sh: 2: Syntax error: "|" unexpected Out[60]: 512 b 99. sh: 2: Syntax error: "|" unexpected Out[60]: 512 b 76. sh: 2: Syntax error: "|" unexpected Out[60]: 512 b 77. sh: 2: Syntax error: "|" unexpected Out[60]: 512 d 89. sh: 2: Syntax error: "|" unexpected Out[60]: 512 d 99. sh: 2: Syntax error: "|" unexpected Out[60]: 512 b 94. sh: 2: Syntax error: "|" unexpected Out[60]: 512 d 54. sh: 2: Syntax error: "|" unexpected Out[60]: 512 d 66. sh: 2: Syntax error: "|" unexpected Out[60]: 512 c 81. sh: 2: Syntax error: "|" unexpected Out[60]: 512 c 61. sh: 2: Syntax error: "|" unexpected Out[60]: 512 

и который повторяет

 for i in `seq 1 $lines`; do head -n $i $@ | tail -n 1 | text2wave -o temp.wav 

но он удобен для тестирования всего, потому что он просто читает его ( festival и text2wave являются частью одного и того же пакета, один читает вещи, а другой пишет файлы) …

теперь количество строк, которые уже получены и сохранены в linelength (у меня не было проблемы с получением python для этого):

Если бы это было просто

 for i in range(linelength): lineone = linecache.getline(filename, i) os.system("echo somestuffnotaline | festival --tts") 

тогда фестиваль скажет «somEhstuffnotaLINE», но я бы не был так счастлив, как мог бы, если бы он сказал: «c 62» – «d 74» – и т. д., те , которые являются содержимым каждой строки в файлах, которые обрабатываю ,

2 Solutions collect form web for “Как выполнить эту команду оболочки из Python?”

Ваш вопрос длинный и бессвязный, и я не знаю, чего вы ожидаете от ответа. Идя по вашему названию, я думаю, что вы сосредоточены на этом фрагменте кода Python:

 lineone = linecache.getline(filename, i) os.system("echo " + lineone + "|" + "festival --tts") 

Ваша проблема в том, что lineone – это целая строка, включая окончательную новую строку. Вам нужно, как говорится, на земле Перла, проглотить это .

 lineone = linecache.getline(filename, i).rstrip('\n') os.system("echo " + lineone + "|" + "festival --tts") 

Ваш первый сценарий оболочки выглядит ужасно сложным и медленным для того, что он делает. Почему вы вычисляете количество строк, а затем возвращаете строки по номеру? Вы могли бы просто прочитать ввод по одной строке за раз , как в Python.

 while IFS= read -r line; do echo "$line" | text2wave -o temp.wav sox "otherstuff.wav" "temp.wav" "silence.wav" "output.wav" mv output.wav otherstuff.wav rm temp.wav done 

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

 while IFS= read -r line; do echo "$line" | text2wave -otype raw >>otherstuff.raw cat silence.raw >>otherstuff.raw done sox … otherstuff.raw otherstuff.wav 

Вам нужно будет указать sox какие параметры (такие как глубина выборки) закодированы в исходном звуковом файле.

Я бы предложил использовать вызов popen() вместо system() и написать строки во входной поток.

 import linecache, os p = os.popen("festival --tts", "w") for i in range(linelength): lineone = linecache.getline(filename, i) p.write(lineone+'\n') p.close() 

Воспользуйтесь тем, что festival может принимать несколько строк текста в качестве входных данных.

  • Редактирование текстового файла с Vim не обновляет tail -f
  • Только кошка из определенной строки X (с рисунком) в другую определенную строку Y (с рисунком)
  • Как активно grep log за последние 15 секунд для фразы?
  • Хвост нескольких файлов и вывод в качестве дополнительного столбца с результатами поиска
  • Периодически получать новые строки из файла, возможно, зависания
  • Перенаправить выход хвоста в файл, а затем остановить, когда найдено совпадение
  • Как эхо из определенной строки файла в другую определенную строку
  • Добавьте возврат каретки к выходу `tail` при использовании` grep`
  • Создайте список каждого пользователя, которому принадлежит файл в заданном каталоге, а также количество файлов и каталогов, которыми они владеют.
  • любой способ объединить grep и tail для создания таблицы таблицы из командной строки
  • Как сделать `head` и` tail` на вход с нулевым ограничением в bash?
  • Linux и Unix - лучшая ОС в мире.