Запуск Python с STDIN из Bash - PullRequest
2 голосов
/ 01 марта 2010

У меня есть код bash (Mybash1.sh), в котором нужно передать результат к другому bash-коду (Mybash2.sh), содержащему Python

Вот коды. Mybash1.sh

#! /bin/bash
# Mybash1.sh
cut -f1,3 input_file.txt | sort | ./Mybash2.sh 

Mybash2.sh это:

#! /bin/bash
#Mybash2.sh
python mycode.py foo.txt <("$@") > output.txt
# do something for output.txt

У меня проблема в том, что "output.txt" в Mybash2.sh не содержит результата. Есть ли правильный способ выполнить Python в Mybash2.sh?

Обратите внимание, что mycode.py будет работать, если я запустлю его на промежуточном временном файл предоставлен Mybash1.sh. Но я хотел избежать этого, так как я позвоню Mybash2.sh во многих случаях в пределах Mybash1.sh.

Фрагмент mycode.py выглядит следующим образом:

if __name__ == "__main__":
    import sys, os, fileinput
    progName = os.path.basename(sys.argv[0])
    if len(sys.argv) != 3:
        sys.exit('Usage: ' + progName + ' file1 file2')
    file1 = fileinput.input(sys.argv[1])
    file2 = fileinput.input(sys.argv[2])

    # do something for file1 and file2

    file1.close()
    file2.close()

Ответы [ 2 ]

2 голосов
/ 01 марта 2010

В питоне вы хотите иметь file2 = sys.stdin.

А потом:

#! /bin/bash
#Mybash2.sh
python mycode.py foo.txt > output.txt

РЕДАКТИРОВАТЬ: Я только что видел документацию по fileinput и кажется, что если вы укажете '-' для fileinput.input (), он будет читать stdin, поэтому без каких-либо изменений в вашем Python это должно работать:

#! /bin/bash
#Mybash2.sh
python mycode.py foo.txt - > output.txt
0 голосов
/ 01 марта 2010

в вашем myscript1.sh вы передаете конвейер myscript2.sh, поэтому это своего рода STDIN для myscript2.sh. Вы должны прочитать этот STDIN из myscript2.sh, не принимая входные аргументы. например, myscript2.sh

#!/bin/bash
while read myinput
do
 echo "myinput is $myinput"
 # assuming you are passing each input line from the cut command into Python
 python mycode.py foo.txt $myinput > output.txt
done

Наконец, почему все эти зависимости? вы не можете сделать все на Python или оболочки ??

...