Как выполнить эту команду оболочки из 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 может принимать несколько строк текста в качестве входных данных.

  • grep не работает в цикле for по списку
  • После виртуального файла?
  • Можно ли изменить количество строк по умолчанию хвоста?
  • Как извлечь первую и последнюю строки в файле?
  • Подавлять сообщения об усечении файла при использовании хвоста
  • Скользящее среднее в файле журнала с awk или другими утилитами unix?
  • Команда для удаления первого N числа строк на входе
  • Как извлечь количество физических процессоров и потоков на ядро? (Нет текста, только номер для использования в качестве входных данных в другом месте)
  • Найдите кучу gps-файлов в папке для окончательного расстояния, выведите список расстояний
  • Как я могу скопировать n строк после последних двух вхождений строки в файл?
  • Как следить и искать в файле, проходящем через фильтр, менее
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.