2012-03-05 20 views
6

Клянусь, я видел это раньше, но не могу найти его сейчас. Можно ли иметь сценарий оболочки начать питон interpeter «в середине потока», то есть:Возможно использование смешанного скрипта и скрипта python?

#!/bin/bash 
#shell stuff.. 

set +e 

VAR=aabb 

for i in a b c; do 
    echo $i 
done 

# same file! 

#!/usr/bin/env python 
# python would be given this fd which has been seek'd to this point 

import sys 

print ("xyzzy") 

sys.exit(0) 

ответ

8

Вы можете использовать этот синтаксис оболочки (она называется здесь документ в Unix литературе):

#!/bin/sh 
echo this is a shell script 

python <<@@ 
print 'hello from Python!' 
@@ 

Маркер после '< <' оператор может произвольным идентификатором, люди часто используют что-то вроде EOF (конец файла) или EOD (конец документа). Если маркер начинает строку, оболочка интерпретирует ее как конец ввода для программы.

2

Вы могли бы написать

exec python <<END_OF_PYTHON 
#!/usr/bin/env python 

import sys 

print ("xyzzy") 

sys.exit(0) 
END_OF_PYTHON 

заменить процесс Bash с Python и передать указанную программу на Python на стандартный ввод. (The exec заменяет процесс Баш Стандартный ввод <<END_OF_PYTHON причины, чтобы содержать все вверх до END_OF_PYTHON.).

+0

+1: поскольку execing превосходит только вызов python. В этом контексте shebang не нужен, и будет рассматриваться только как комментарий. –

+0

@WilliamPursell: Знаешь, я даже не заметил shebang. , , это не только ненужно, но и фактически вводит в заблуждение, так как это не будет вызывать 'env'. Я полагаю, что команда может быть 'exec env python << END_OF_PYTHON', но, вероятно, лучше просто удалить shebang. – ruakh

0

Конечно сразу после я отправил это, я вспомнил, как сделать это:

#!/bin/sh 

echo Shell 

python <<EOF 

import sys 

print "Python" 

sys.exit(0) 

EOF 
2

Если ваш python сценарий очень короткий. Вы можете передать его в виде строки в python используя -c вариант:

python -c 'import sys; print "xyzzy"; sys.exit(0)' 

Или

python -c ' 
import sys 
print("xyzzy") 
sys.exit(0) 
' 
0

Я согласен, что смешивание/разминание вверх может быть довольно мощной техникой - не только в сценарии, но и в командной строки (например, Perl-интерфейсы оказались очень успешными с течением времени). Так что мой маленький кончик на другой вариант однострочных (в дополнении к упомянутым к) для смешанных сценариев в Баше/Python:

for VAR in $(echo 'import sys; print "x y z"; sys.exit(0)' | python -);do echo "$VAR"; done; 

производит

x 
y 
z 
0

Это отлично подходит для короткого инлайн сценария/код. Если вы можете полагаться на скрипт bash как подходящий клей для написания большого, хорошего приложения, можно было бы, чтобы разные члены команды пишут код/​​скрипт на любом языке, на котором они хороши, и тогда можно просто связать их работу следующим образом. Конечно, нужно было бы также предположить, что для одного приложения так много разных режимов работы. @ user318904 @phs @piokuc

#!/bin/bash 
java hello 
#hello class bytecode to be in the path 
python hello.py 
elixir simple.exs 
perl hello.pl 
nodejs sum1.js 
coffee sum2.coffee 
#any other bash script can be put anywhere 
Смежные вопросы