2014-09-15 4 views
0

파이썬에서 많은 bash 명령을 실행해야합니다. 잠시 동안
subprocess.Popen (cmd, shell = True)을 사용하여이 작업을 수행하고 있습니다. 동일한 쉘에서이 명령을 모두 실행하는 솔루션이 있습니까? subprocess.Popen은 매번 실행될 때마다 새 셸을 열고 모든 호출시 필요한 모든 변수를 설정해야 cmd 명령이 제대로 작동합니다.파이썬에서 서브 프로세스를 사용하여 새 하위 프로세스 생성 금지

+0

실행하는 각 명령은 여전히 ​​하위 프로세스이며 스크립트 또는 스크립트에 의해 생성 된 셸의 하위 프로세스입니다. 자녀와 스크립트 사이에 쉘이 필요합니까? – soulseekah

+0

모든 하위 프로세스에서 .Popen 변수를 내보내고 동일한 호출에서 cmd 명령을 실행해야합니다. 이것은 추한 구문을 생성합니다. 이 변수를 한 번만 내보내고 그 후에는 내 cmd 명령을 실행하는 것이 좋습니다. –

+0

'subprocess.Popen()'을 실제로 사용해야하는 경우가 아니라면, 대신에'multiprocessing.Process'를 사용해야합니다. (귀하의 모든 직업은 독립적이며 비공식입니까?작업 순서의 중간에 0이 아닌 오류 상태를 잡는 것에 대해 걱정할 필요가 있습니까?) – smci

답변

-1

대신 multiprocessing을 사용하면 더 가볍고 효율적입니다.

subprocess.Popen과 달리 실행될 때마다 새 셸을 열지 않습니다.

subprocess.Popen을 실행할 때이 필요하다고 말하지 않았으므로 필요하지 않을 수도 있습니다. 당신은 방금 그것이 당신이 현재하고있는 것이라고 말했습니다. 더 정당화하십시오.

환경 프로세스에서 환경 변수를 한 번 설정하는 방법은 set env var in Python multiprocessing.Process을 참조하십시오.

+1

'다중 처리 '가 실제로 여기서 도움이 될 수있는 방법을 설명 할 수 있습니까? – dano

+0

subprocess.Popen과 다르기 때문에 매번 실행될 때마다 OP가 새로운 쉘을 열지 않습니다. 정답을 하향 투표하지 않는 것을 고려 했습니까? 그것은 짜증스럽고 파괴적입니다. – smci

+1

나는 downvote하지 않았다. 'subprocess.Popen'은 자식 프로세스를 실행합니다. 'multiprocessing.Process'는 다른 프로세스에서 파이썬 호출 가능 함수를 실행합니다. 어떻게 OP를 원한다면 하나의 쉘에서 여러 개의 bash 명령을 실행하기 위해'다중 처리. 프로세스 (multiprocessing.Process) '를 사용할 수 있을까요? – dano

1

실행해야하는 모든 명령을 사용하여 셸 스크립트를 작성하지 않고 단일 subprocess.Popen() 호출을 사용하여 실행하십시오. 실행할 명령의 내용이 Python 스크립트에서 계산 된 결과에 따라 다르면 셸 스크립트를 동적으로 만든 다음 실행하면됩니다.

+0

내 명령은 다른 명령에 의해 구분됩니다. 나는 이것이 어떻게 행해질 지 모르지만 복잡한 구문을 초래할 것이라고 생각합니다. –

+0

하나의 쉘을 갖는 것이 여전히 0 쉘보다 나쁩니다. 우리가 왜 zero shell을 가질 수 없는지에 대한 이유는 알지 못한다. 명시 적 argv 배열을 가지고 각 command를 호출하고 (암시 적으로)'shell = False'를 호출한다. –

2

subprocess.Popen을 사용하면 실행중인 프로세스의 환경이 될 환경 변수 사전을 제공 할 수 있습니다. shell=True이 필요한 유일한 이유가 환경 변수를 설정하는 것이라면, 대신 명시 적 환경 사전을 사용하는 것이 좋습니다. 더 안전하고 특히 어렵지 않습니다. 또한, 인용 및 셸 메타 문자에 대해 걱정할 필요가 없을 때 일반적으로 명령 호출을 구성하는 것이 훨씬 쉽습니다.

실행중인 프로세스에서 환경 변수를 설정하지 않아도 환경 사전을 작성하지 않아도됩니다. (대개의 경우 문제가되지 않지만 때로는 알기 쉽습니다.)

설정으로 자신의 환경을 수정할 수 있다면 : 어떤 이유로 당신이 당신의 자신의 환경을 변경할 수없는 경우

output = subprocess.check_output(["ls", "-lR", "/tmp"]) 

, 당신의 사본을 만들 필요가 :

os.environ['theEnvVar'] = '/the/value' 

은 그럼 그냥 간단한 Popen.call (또는 유사)를 실행하는 명령을 사용할 수 있습니다 현재 환경을 원하는대로 수정하고 각에 전달합니다.: 당신이 env=env마다 시간을 지정하고 싶지 않을 경우

env = os.environ.copy() 
env['theEnvVar'] = '/the/value' 
output = subprocess.check_output(["ls", "-lR", "/tmp"], env=env) 

는 조금 래퍼 클래스를 작성합니다.