2009-02-26 19 views
3

Popen의 동일한 "세션"에서 여러 번 호출하는 방법이 있습니까? 예를 들어, 하나의 긴 문자열로 명령을 연결하지 않고도 그 다음에 다른 하나를 호출 할 수 있습니까?Python persistent Popen

+2

"세션"은이 컨텍스트에서 아무 것도 의미하지 않으므로 수행하려는 작업을 설명 할 수 있습니까? 이 질문은 분석하기가 어렵고 많은 의미가없는 것처럼 보입니다. 아마도 목표가 무엇인지 설명하면 도움이 될 것입니다. –

답변

3

popen을 사용할 때 "전화를 걸지 않습니다."실행 파일을 실행하고 stdin, stdout 및 stderr를 통해 대화하고 있습니다. 실행 파일이 작업의 "세션"을 수행 할 수있는 방법이 있다면 (예를 들어 stdin에서 행을 읽음으로써), 그렇습니다. 그렇지 않으면 여러 번 간부해야합니다.

subprocess.Popen는 (대부분) 단지 execvp는 주위의 래퍼 (3)

+0

기술적으로 정확한 대체 솔루션을 제공하는 것이 아니라 실제 개념을 설명합니다. 항상 좋은 솔루션입니다. – Arafangion

+0

@Arafangion : "대안 솔루션"은 어떻게 생겼습니까? 나는 그 질문이 무엇인지를 알 수 없다. 유일한 대답은이 것입니다. 개념이 잘못되었습니다. –

0

예를 들어, 하나의 긴 문자열로 명령을 연결하지 않고도 전화를 걸고 다른 하나를 호출 할 수 있습니까?

shell = True를 사용하고있는 것처럼 들립니다. 당신이 필요하지 않으면하지 마십시오. 대신 shell = False (기본값)를 사용하고 명령/arg 목록을 전달하십시오.

Popen의 동일한 "세션"에서 여러 통화를 수행하는 방법이 있습니까? 예를 들어, 하나의 긴 문자열로 명령을 연결하지 않고도 그 다음에 다른 하나를 호출 할 수 있습니까?

두 개의 Popen 인스턴스를 만들고 필요에 따라 각각에 대해 대기/통신 할 수없는 이유는 무엇입니까? 내가 정상적으로 당신을 이해한다면 그것은 정상적인 방법입니다.

+0

shell = True를 사용하지 않는 이유는 무엇입니까? –

+0

@DavidDoria는 보안 책임이므로 공격자가 Popen의 입력에 영향을 줄 수 있으면 코드를 삽입 할 수 있습니다. (예 : "ls"+ user_input 실행이 분명히 잘못됨). shell = False는이 모든 것을 완전히 피할 수 있으므로 보안 속성은 Popen에서 호출하는 프로그램에 의존하므로 아무 것도 필요 없습니다. –

1

당신이 쉘을 실행하고 그것을 여러 명령을 보내 (과 출력을 읽기) 할 수 있도록하려면 가정하면, 당신이 할 수있는 표시 이 같은 :

>>> p.stdin.write("cat /etc/motd\n") 
>>> p.stdout.readline() 
'Welcome to dev-linux.mongo.com.\n' 

가 (물론, 당신이 너무 stderr를 확인하거나 다른을 요청해야

from subprocess import * 
p = Popen(['/bin/sh'], shell=False, stdin=PIPE, stdout=PIPE, stderr=PIPE) 

, : 예, 그 이후 210을 병합하여 stdout). 하나의 메이저 문제과 위의 내용은 stdinstdout 파이프가 블로킹 모드에 있기 때문에 쉘에서 출력하기 위해 영원히 기다리는 것을 막을 수 있습니다. 시도하지는 않았지만 ActiveState 사이트에이 문제를 해결하는 방법을 보여주는 recipe이 있습니다.

업데이트은 : 관련된 질문/답변보고 후, 그것을 그냥 사용하는 것이 더 간단 할 수도처럼 보이는 파이썬의 내장 select 모듈이 데이터는 당신이 동일한 작업을 수행도한다 (stdout에 읽을 수 있는지 확인하기 위해 예 : , 예 :

>>> select.select([p.stdout], [], [], 0) 
([<open file '<fdopen>', mode 'rb' at 0x10341690>], [], []) 
+0

쉘 (shell) = 트루 (true)로 중간에 명령 (';')을 연결하는 것보다 다르지 않습니다. 원래의 포스터가 무엇을 제안했는지 알 수있는 범위까지. 쉘 기능이 필요하지 않는 한 여전히 나쁘다. 더 안전한 대안이 있습니다. 아마도 –

+0

; 그 질문에서 불분명하다. 그러나 실제 사용자와 쉘 (어떤 이유로) 사이의 "프록시"역할을하거나 이벤트 등을 기반으로 주기적으로 명령을 보내려면이 작업을 수행하는 것이 유용 할 수 있습니다. 예를 들어 액티브 스테이트 레시피는 실제 사용 사례에서 영감을 얻은 것으로 보입니다. –

+0

나는 완전히 동의한다, 나는 다만이 충고가이 특정한 문맥에서 반드시 좋다고 생각하지 않는다. 나는 묻는 사람 만 알고 있다고 생각합니다. –