Каков наилучший способ прочитать файл из stdin, используя скрипт bash, и передать строки чтения скрипту python? - PullRequest
0 голосов
/ 26 сентября 2018

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

./codeName < fileToRead.in > fileToWrite.out

Код C читает файл fileToRead.in, выполняет некоторыезадач, а затем распечатать его результаты в файл toWrite.out.

Проблема: Дело в том, что я пытаюсь переписать код C в Python, но для сохранения совместимости скрипт должен быть вызван точно так жеспособ .

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

cat<&0 |
while read a; do    
  # at this point, the current line is associated with $a
  # maybe I can send each line to the python script?
done>&1 

Наконец, есть ли способ прочитать имена файлов, поставляемые с "<операторы "и"> в bash?

1 Ответ

0 голосов
/ 26 сентября 2018

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

Во-первых, вы хотите считывать и записывать файлы в python, используя операторы < и > в командной строке.Это должно быть просто;оболочка будет обрабатывать трубопровод, поэтому все, о чем вам нужно беспокоиться, это вход / выход.Давайте назовем это my_script.py:

if __name__ == "__main__":
    import sys;
    x = sys.stdin.read()  # read stdin
    print(x)              # write to stdout. You could also use sys.stdout.write()

Во-вторых, вы хотите вызвать скрипт Python, но вам нужно использовать ./script, чтобы сделать это из соображений совместимости.Если это так, вы можете написать действительно простой сценарий оболочки, чтобы просто вызывать скрипт python, вызывать его так, как ему нужно, и заранее использовать chmod для установки разрешений, чтобы он мог выполнятьсякаким процессом это нужно.Давайте просто назовем этот файл codeName.Для этого потребуется всего одна строка:

python my_script.py

, а затем, если вы выполните следующее:

$ ./codeName < fileToRead.in > fileToWrite.out

каналы для stdin и stdout все равно будут работать для самого скрипта.Он будет выполнять сценарий codeName, который, в свою очередь, будет запускать команду python my_script.py, которая будет запускать код Python, который будет читать из stdin и записывать в stdout, , который был передан по каналу и в fileToRead.in иfileToWrite.out соответственно .


РЕДАКТИРОВАТЬ: На самом деле, @BenjaminW.делает хорошее замечание в своем комментарии.Вы можете пропустить дополнительный файл сценария оболочки и просто переименовать myscript.py в codeName и дать ему правильные разрешения.Вам просто нужно добавить следующую строку вверху:

#!/usr/bin/env python

, которая должна запускать файл, используя исполняемый файл python.Возможно, вам придется изменить путь, чтобы сослаться на фактическую папку, в которой находится python на вашем компьютере.

...