2013-03-26 4 views
0

다른 프로세스 (나는 subprocess.Popen을 사용합니다)를 실행해야하는 Python 프로그램이 있습니다. 나는이 실행이 다음은 쉘 명령 프롬프트에서 사용자가 입력 한 것처럼 행동해야합니다어떤 쉘이 실행 중인지 확실하게 확인하십시오.

$ source path/to/some_file 
$ ./some_program 

은 내가 shell=True 사용할 것으로 기대하고 명령의 형태는 첫 번째 실행 source에 체인 다음 프로그램을 실행합니다. 그러나, 나는 다음과 같은 문제에 직면하고있다 :

내 파이썬 프로그램을 실행 쉘은 bash, sh, tcsh (또는 어쩌면 csh의 다른 맛)이 될 수 있습니다. 어떤 쉘이 실행되고 있는지에 따라 다른 some_file을 소스 화해야합니다. 이것을 결정할 방법이 있습니까? 파이썬에서 또는 Popen(..., shell=True) 내부에서 뭔가를 실행하여 둘 다 할 수 있습니다.

다른 셸에서 다른 출력을 얻기 위해 일종의 "셸 다단계"를 작성하려고했지만 내 셸 기술 (특히 csh에서)은 그러한 작업에 맞지 않습니다. 어떤 옵션이 있습니까?

+0

[실행 가능] (http://docs.python.org/2/library/subprocess.html#subprocess.Popen) 인수를 사용하여 특정 셸을 강제로 'shell = True'로 설정할 수 있습니다. –

+1

유닉스에서 사용 된 쉘은 사용자가 실제로 사용하고있는 쉘과 관계없이/bin/sh를 기본값으로 사용합니다. – Cairnarvon

+0

@Cairnarvon, 예,하지만/bin/sh는 다른 리눅스에서 다른 것들과 심볼릭 링크됩니다. –

답변

1

.. 껍질을 산란시키고 그걸로 의사 소통하는 것은 어떨까요?

proc = subprocess.Popen(['/bin/bash'], stdin=PIPE, stdout=PIPE) 
proc.communicate("source path/to/some_file\n" 
       "./some_program\n") 

특정 쉘 내부에 두 개의 명령을 실행할 때문에

, 나는 이것이 당신이 최선의 해결책이 될 것이라고 생각 :

나는이 같은 것을 의미한다.

그렇지 않으면 쉘이 "init script"및 "initial command"와 같은 인수를 사용할 수 있습니다. 이 경우 특정 쉘을 사용해야 할 경우 사용해야합니다. 예를 들어 bash는 작업을 수행하는 --init-file file-c command을 허용합니다 (--init-file은 bashrc 대신로드됩니다).

3

subprocess.Popen()에 의해 사용되는 셸은 파이썬을 시작하는 데 사용되는 상위 셸에 의해 결정되지 않습니다. 대신 Python에서 사용하는 셸은 기본적으로 항상 /bin/sh이며, 실행 파일을 명시 적으로 지정하여 Popen()으로 변경할 수 있습니다.

하지만 실제로 특정 쉘 스크립트는 특정 쉘 유형에 대해 작성 될 수 있습니다. bash이라고 가정 해 보겠습니다. 이

#!/usr/bin/env bash 
source path/to/some_file 
exec ./some_program 

당신이 이동 : 그럼 당신은 단순히이 같은 쉘 스크립트를 작성하여 파이썬 측이 세부 사항을 무시할 수 있습니다 시작에 비난로 전환 완전한 실행 스크립트, 필요한 비트 소스를하고 시작하여 프로그램. 어떤 합리적인 쉘이라도 그것을 실행할 수 있어야합니다. 그래서 이제는 파이썬이 어떤 쉘을 호출하는지에 대해 걱정할 필요가 없습니다 ... 파이썬 밖에서 프로그램을 실행할 수있는 반복 가능한 방법이 있습니다.

관련 문제