2010-02-23 4 views
2

는 내가 뭘하려는 것은 내가 ipython 솔루션은 가장 좋은 것입니다 가정대화 형 파이썬 세션에 대한 명령의 파이프 출력?

$echo $PATH | python --remain-interactive "x = raw_input().split(':')" 
>>> 
>>> print x 
['/usr/local/bin', '/usr/bin', '/bin'] 

같은 것입니다. 달성 할 수 없다면 다양한 다른 명령의 출력을 처리하려는 상황에 대한 해결책은 무엇입니까? 절망적이었을 때 하위 프로세스를 사용 했었지만 이상적이지는 않습니다.

는 UPDATE

: 그래서이 최종 결과에 점점 더 가까이 : 이제 우리는 형태

echo $PATH | pyout 

pyout에이 굴곡에 대해 갈 수있는 방법을

echo $PATH > /tmp/stdout.txt; ipython -i -c 'stdout = open("/tmp/stdout.txt").read()' 

은 "마법의 솔루션입니다 내 모든 문제에 ". 파이프 된 출력을 쓰고 ipython을 실행하는 쉘 스크립트 일 수 있습니다. bp가 말하는 것과 같은 이유로 모든 일이 실패합니다.

답변

2

$의 이중 이스케이프

비록 고통이

x = !echo $$$$PATH 

당신은이 작업을 수행 할 수 16,

나는

PATH="$PATH" 
x = !echo $PATH 
x[0].split(":") 
0

파이썬의 공리 때문에 "그 중 하나가 있어야합니다 - 명백한 방법이 있어야합니다"라고 말하면서 the subprocess module보다 다른 프로세스와 상호 작용할 수있는 더 좋은 방법이 없다고 합리적으로 확신합니다. 같은 것이 다음 "적합하지 않다"는 이유를 말할 수 있다면 도움이 될

:

>>> process = subprocess.Popen(['cmd', '/c', 'echo %PATH%'], stdout=subprocess.PIPE) 
>>> print process.communicate()[0].split(';') 

(특정 예에서 당신이 os.environ을 사용할 수 있습니다하지만 그건 당신이 요구하는지 정말 아니다 알고 있습니다.) 당신이 할 수있는 IPython에서

+0

되고 난 쉘 명령 행에 있었다 빠르고 쉽게 얻을 원한다면 실용적인 통역사로 출력하는 것이 이상적이라고 생각하십니까? 간단히 말해, 쉘의 표준 출력을 새로운 대화식 세션으로 리디렉션하지 않습니다. 그것은 세션을 먼저 시작한 다음 쉘 명령을 실행하기 때문에 이상적이지 않습니다. 임시 파일을 작성하고 ipython을 실행시키는 bash 함수를 얻을 수 있습니다. – physicsmichael

1

당신이 찾고있는 --remain-interactive 스위치가 -i 것 같다. -c 스위치를 사용하여 실행할 명령을 지정할 수도 있습니다 (예 : __import__("sys").stdin.read().split(":")). 그래서 당신이 시도 할 수 있습니다 : (문자열을 이스케이프에 대해 잊지 마세요!)

echo $PATH | python -i -c x = __import__(\"sys\").stdin.read().split(\":\") 

그러나이 표시됩니다 모든입니다 :

>>> 

그래서 왜 작동하지 않는가? 왜냐하면 너는 배관하고 있기 때문이야. 파이썬 인터프리터는 인수를 읽는 동일한 sys.stdin의 명령을 대화식으로 읽으려고합니다. echo 실행이 완료되었으므로 sys.stdin이 닫히고 더 이상 입력 할 수 없습니다. 같은 같은 이유로

, 뭔가 :

echo $PATH > spam 
python -i -c x = __import__(\"sys\").stdin.read().split(\":\") < spam 

이 ... 실패합니다.

내가 뭘 할 것은 모든 후

echo $PATH > spam.bar 
python -i my_app.py spam.bar 

, open("spam.bar")되기 바로 sys.stdin 같은 파일 객체 : 그래서

+0

분명히 여기서 나는 당신이'sys.path'에 대해 알고 있다고 가정하고,'echo $ PATH'는 여러분이 요점을 설명하기 위해 사용했던 임의의 임의의 명령이었다고 가정합니다. – badp

+1

@bp, sys.path는 파이썬이 모듈을 가져 오는 데 사용하는 경로입니다. $ PATH와 같지 않습니다. 여러분은 아마도'os.environ [ "PATH"]' –

+0

@bp를 생각할 것입니다. 당신의 대답에 관해서는 출력을 파싱하기 위해 my_app를 작성하지 않아도됩니다. 예를 들어, .split (':')을 자신의 파일에 넣으면 성가 시게됩니다. 그 -i 스위치는 그 자체로 편리 할 것입니다; 나는 그것이 작동하지 않았기 때문에 오해했다고 생각했다. – physicsmichael