2011-03-28 2 views
15

파이썬에서 BASH 내장 명령을 실행할 수있는 방법이 있습니까? BASH 기본 제공 명령을 파이썬에서 실행 하시겠습니까?

는 I 시도 :

subprocess.Popen(['bash','history'],shell=True, stdout=PIPE) 

subprocess.Popen('history', shell=True, executable = "/bin/bash", stdout=subprocess.PIPE) 

os.system('history') 

및 다양한 변형을 포함한다. history 또는 fc -ln을 실행하고 싶습니다.

+1

두 번째 것 같습니다. 무엇이 잘못 되었습니까? –

+0

bash 프로세스를 실행하고이 프로세스와 상호 작용하는 것은 어떻습니까? 더 긴 명령 실행이나 쉘과의 상호 작용 (즉,'sudo '이후의 암호 입력)은 더 간단하고 유용 할 수 있습니다. 나는 [pexpect] (http://www.noah.org/wiki/pexpect)가 그 필요에 맞을 것이라고 생각한다. –

답변

16

마침내 작동하는 솔루션을 발견했다.

from subprocess import Popen, PIPE, STDOUT 
shell_command = 'bash -i -c "history -r; history"' 
event = Popen(shell_command, shell=True, stdin=PIPE, stdout=PIPE, 
    stderr=STDOUT) 

output = event.communicate() 

의견을 보내 주셔서 감사합니다.

+0

'shell = True'는 여기서 중복됩니다 (불필요한'/ bin/sh'를 시작합니다). 당신은 그것을 떨어 뜨리고 list argument를 [@ lesmana 's answer] (http://stackoverflow.com/a/5461020/4279) – jfs

+2

과 같이 사용할 수 있습니다. 불행하게도 '-r'옵션은 현재 실행 된 명령을 얻지 못합니다. 껍질을 열어. '-r'옵션은 ~/.bash_history 파일에있는 내용을 방금 연 새로운 쉘에로드합니다. 그러나 ~/.bash_history 파일은 일반적으로 셸을 닫을 때만 업데이트됩니다 (.bashrc에 PROMPT_COMMAND 해킹이 없으면). 현재 실행중인 셸을 닫을 수 없으므로 (히스토리 파일을 업데이트하려면) 운이 없다. 아직 해결 방법을 찾지 못했습니다. – ishmael

12
subprocess.Popen(["bash", "-c", "type type"]) 

이 bash는 호출하고 인수 type에 내장 명령 type을 실행하는 문자열 type type를 실행하는 bash에 알려줍니다.

출력 : -ctype is a shell builtin

부분은 한 문자열이어야한다. 이 작동하지 않습니다 : ["bash", "-c", "type", "type"]

+0

'type'및 'alias'와 작동하지만 'history'또는 'fc -ln'과는 작동하지 않습니다. – duanedesign

+3

@duanedesign 그들은 작동하지만 서브 프로세스에서 시작된 bash 세션은 히스토리가 사용 불가능합니다. 이 동작은 의도적으로 설계된 동작입니다. 당신은 bash에게 어떻게 든 역사를 가능하게해야 할 것입니다. 나는 얼마 전 stackexchange 사이트에서 그것에 관한 질문을 읽었던 것을 기억한다. 내가 다시 찾으면 다시보고 할거야. – lesmana

+1

@duanedesign http://unix.stackexchange.com/questions/5684/history-command-inside-bash-script/ – lesmana