2010-02-03 6 views
37

bash 스크립트 안에 짧은 파이썬 스크립트 텍스트를 삽입하고 싶습니다. 내 말은, .bash_profile입니다. 그런 일을하는 가장 좋은 방법은 무엇입니까?bash 스크립트 안에 짧은 파이썬 스크립트 포함하기

지금까지이 솔루션은 -c 옵션을 사용하여 파이썬 인터프리터를 호출하고 stdin에서 읽고 어떤 exec에 인터프리터를 알리는 것입니다. 거기에서, 나는 내 대화 형 프롬프트에서 사용하는 텍스트를 처리 할 수 ​​있도록 다음과 같은 간단한 도구를 구축 할 수 있습니다 :

이 방법하지만 나에게 약간의 재미 냄새, 나는 그 일에 어떤 대안을 궁금하네요

function pyexec() { 
    echo "$(/usr/bin/python -c 'import sys; exec sys.stdin.read()')" 
} 

function traildirs() { 
    pyexec <<END 
trail=int('${1:-3}') 
import os 
home = os.path.abspath(os.environ['HOME']) 
cwd = os.environ['PWD'] 
if cwd.startswith(home): 
    cwd = cwd.replace(home, '~', 1) 
parts = cwd.split('/') 
joined = os.path.join(*parts[-trail:]) 
if len(parts) <= trail and not joined.startswith('~'): 
    joined = '/'+joined 
print joined 
END 
} 

export PS1="\h [\$(traildirs 2)] % " 
이 방법은있을 수 있습니다.

필자의 bash 스크립팅 기술은 매우 초보적이므로, 배쉬 인터프리터의 관점에서 보면 어리석은 짓을하고 있는지 듣고 싶다.

+0

실제로 무엇을하려고합니까? 내가보기에, 파이썬은 실제로 필요하지 않습니다. 쉘을 사용하여 대부분의 작업을 수행 할 수 있습니다. – ghostdog74

+1

@ ghostdog74 : 내가 말하는 것보다 더 깊은 것은 아무것도 없다. 필자는 bash 프로그래머보다 훨씬 뛰어난 파이썬 프로그래머이며, IMO 파이썬은 일반적으로 bash보다 더 강력합니다. 파이썬에서 bash 스크립트에 사용 된 기능을 구현하는 것이 편리 할 수도 있고 때로는 외부 파일에 의존하지 않는 경우도 있습니다. 나는 마침내 tcsh에서 bash (15 년 후)로 바뀌고 있으며 쉘을 나의 유언/선호도로 굽히려고합니다. –

+0

-1 : 단순히 .py 모듈 파일을 만드는 것이 어떨까요? 왜 더 나은 해결책이 (보통) 쉘을 완전히 사용하지 않을 때 파이썬을 쉘 스크립트로 강제할까요? –

답변

27

파이썬 인터프리터가 stdin의 동의어로 명령 행에서 -을 받아들이는 그래서 당신은 함께 pyexec에 대한 호출을 대체 할 수

python - <<END 

명령 줄 참조 here를 참조하십시오. 재미있는

+1

어 - 파이썬 맨 페이지에서 텍스트 검색을했는데'stdin' 텍스트가 거기에 없습니다. 더 자세히 살펴보면 "표준 입력"입니다. 도. –

+0

heredoc 접근법을 동의하면 동의 할 수 있습니다.그러나주의해야 할 사항이 있습니다. (1) Python 스크립트의 heredoc 마커 (Ned의 예에서'END')가 0 열에서 발생하면 heredoc이 일찍 종료됩니다. (2) heredoc 마커의 변이 ('-'이 있거나없는)는 탭과 공백이 보존되는지 여부에 영향을줍니다. (3) 가변 확장 기능이 켜져있을 때 파이썬과 bash 사이의 문법적 중첩 (heredoc 마커는 인용되지 않음). '$ {1}'은 (는) Python 문자열 형식 지정자에 정당하게 나타날 수 있지만 heredoc 표식이 인용되지 않으면 bash 명령 줄 매개 변수로 대체됩니다. –

+1

heredoc 마커의 이름을 지정하는 방법에주의하십시오. 예제에서와 같이 인용 부호가없는 경우 셸 확장은 heredoc 문자열 내에서 발생합니다. 예를 들어, 파이썬 코드가'print '$ SHELL''만으로 구성 되었다면 출력은'/ bin/bash' 또는 쉘이 무엇이든지간에 출력 될 것입니다. 첫번째 줄을'python - << 'END''로 바꾸면 출력은'$ SHELL'이됩니다. 기존 코드를 복사하여 붙여 넣기하여 bash 스크립트에 삽입하는 경우 쉘 대체가 거의 필요하지 않습니다. bash 스크립트에 포함되지 않은 경우와 동일한 방식으로 코드를 실행하고 싶습니다. –

33

-c을 사용해야합니까? 이 작품은 나를 위해 :

python << END 
... code ... 
END 

여분의 작업없이.

+2

변수를 출력하기 위해'ABC = $ (Python << END' ...'END)'를 실행 해 보았습니다. –

+0

bash 스크립트에서 오는 문자열 매개 변수를 파이썬과 통신하려면 어떻게해야할까요? –

+0

네드의 답변에서와 같이'-'가 필요합니다. 인수는 대시 다음에 올 것입니다. –

2

는 ... 지금은 너무 ;-)

그는 bash는 스크립트 내에서 파이썬 코드를 실행하는 방법을 요구하지 않는 대답을 원하지만 실제로 파이썬 환경 변수를 설정 있습니다.

이것을 bash 스크립트에 넣고 "작동 했음"이라고 말하십시오.

문제는 python이 환경 사본에서 실행된다는 것입니다. 해당 환경에 대한 변경 사항은 python이 종료 된 후에는 볼 수 없습니다.

거기에 해결책이있는 경우 나도보고 싶습니다. 당신이 bash는 스크립트에서 파이썬의 출력을 사용해야하는 경우

+1

그건 필자가 필자가 얻고있는 것이 아니며, 직접 (직접) 자식 프로세스에서 환경 변수를 가져 오거나 부모의 환경 변수를 (직접) 변경할 수 없다고 확신한다. 그러나 bash 스크립트에서 python 스크립트의 출력을'eval '할 수 있으므로 임의의 명령문을 실행하거나 환경 변수를 설정하거나 다른 작업을 수행 할 수 있습니다. –

+1

@ 에릭 : 정말로 답을 원하면 자신의 질문을 올리십시오. –

+0

Matt, 죄송합니다 ... 저는 파이썬 스크립트를 간략히 살펴 보았고 os.environ을 사용하여 물건을 만들고있는 것을보고 그것이 여러분이하고있는 일과 같은 것으로 생각했습니다. 내 실수. –

7

당신은 같은 것을 할 수 있습니다

#!/bin/bash 

ASDF="it didn't work" 

ASDF=`python <<END 
ASDF = 'it worked' 
print ASDF 
END` 

echo $ASDF 
+1

heredoc 마커의 이름을 지정하는 방법에주의하십시오. 예제에서와 같이 인용 부호가없는 경우 셸 확장은 heredoc 문자열 내에서 발생합니다. 예를 들어, 파이썬 코드가'print '$ SHELL''만으로 구성 되었다면 출력은'/ bin/bash' 또는 쉘이 무엇이든지간에 출력 될 것입니다. 첫번째 줄을'python - << 'END''로 바꾸면 출력은'$ SHELL'이됩니다. 기존 코드를 복사하여 붙여 넣기하여 bash 스크립트에 삽입하는 경우 쉘 대체가 거의 필요하지 않습니다. bash 스크립트에 포함되지 않은 경우와 동일한 방식으로 코드를 실행하고 싶습니다. –

+0

당신 말이 맞아요. 고마워, 크리스! – desgua

0

당신이 zsh을 사용하는 당신이 zsh을의 join과 파이썬 표준 입력을 사용하여 스크립트 내에서 파이썬을 포함 할 수있는 경우 옵션 (python -는) :

py_cmd=${(j:\n:)"${(f)$(
    # You can also add comments, as long as you balance quotes 
    <<<'if var == "quoted text":' 
    <<<' print "great!"')}"} 

catch_output=$(echo $py_cmd | python -) 

당신은 파이썬 조각을 들여 수 있으므로이 EOF 또는 <<END 솔루션 내부의 기능보다 더 낫 네요.

5

경우에 따라 여기에 문서를 사용하는 것은 좋지 않습니다.또 다른 대안은 파이썬 -c를 사용하는 것입니다

bash는 here document를 사용하여와
py_script=" 
import xml.etree.cElementTree as ET,sys 
... 
" 

python -c "$py_script" arg1 arg2 ... 
+0

멋지고 간단하며, 파이썬 코드를 나머지 bash 코드 중간에서 옮길 수 있습니다. 또한 귀하의 파이썬 코드를 stdin에서 읽을 수 있습니다. – dbort

5

하나의 문제는 필터로 파이썬 스크립트를 사용하려는 경우, 그것은 다루기가되도록 스크립트가 다음 stdin에 파이썬에 전달되는 것입니다 . 스크립트가 너무 오래, 당신은 또한 괄호 안에 here document를 사용할 수있는 경우 다음과 같이

... | python <(echo ' 
code here 
') | ... 

: 내부의

... | python <(
cat << END 
code here 
END 
) | ... 

하나 개의 대안이 같은 bashprocess substitution, 뭔가를 사용하는 것입니다 스크립트를 사용하면 평상시와 같이 표준 I/O (예 : sys.stdin.readlines)로 모든 입력을 읽고 쓸 수 있습니다. 또한

, python -c는 다른 답변에서 언급 한 바와 같이 사용하지만, 여기에 내가 아직 파이썬의 들여 쓰기 규칙 ( credits) 존중하면서, 잘 형식으로 할 좋아하는 방법입니다 수 있습니다 : 그냥 있는지 확인

read -r -d '' script <<-"EOF" 
    code goes here prefixed by hard tab 
EOF 
python -c $script 

을 여기에있는 각 줄의 첫 번째 문자는 하드 탭입니다. 당신이 함수 내에서이 넣어 가지고 있다면, 나는 어디 선가 보았다 트릭 아래가 정렬 보이게하기 위해 사용

복사 - 붙여 넣기하는 예를 입력하여
function somefunc() { 
    read -r -d '' script <<-"----EOF" 
     code goes here prefixed by hard tab 
----EOF 
    python -c $script 
} 
+1

왜 0 upvotes? 프로그램에서 sys.stdin을 사용하려는 경우 여기에서 유일한 정답입니다! –

+0

이것은 최고의 솔루션입니다, 그것을 upvote! – user1171968

3

준비 :

input="hello" 
output=`python <<END 
print "$input world"; 
END` 

echo $output 
-1

시도 이 :

#!/bin/bash 
a="test" 
python -c "print '$a this is a test'.title()"