2011-09-12 3 views
3

루비에 다음과 같은 파이썬 코드를 포팅하려고합니다 :Ruby 용 Python의 pty.fork와 같은 것이 있습니까?

import pty 

pid, fd = pty.fork 
if pid == 0: 
    # figure out what to launch 
    cmd = get_command_based_on_user_input() 

    # now replace the forked process with the command 
    os.exec(cmd) 
else: 
    # read and write to fd like a terminal 

터미널과 같은 서브 프로세스를 읽고 써야하기 때문에 커널 대신 루비의 PTY 모듈을 사용해야한다는 것을 이해합니다. .포크. 그러나 동등한 포크 메서드가없는 것 같습니다. 명령을 문자열로 전달해야합니다. 이것은 파이썬의 기능에 가장 가깝습니다.

require 'pty' 

# The Ruby executable, ready to execute some codes 
RUBY = %Q|/proc/#{Process.id}/exe -e "%s"| 

# A small Ruby program which will eventually replace itself with another program. Very meta. 
cmd = "cmd=get_command_based_on_user_input(); exec(cmd)" 

r, w, pid = PTY.spawn(RUBY % cmd) 
# Read and write from r and w 

분명히 그 중 일부는 Linux에만 한정되어 있습니다. 그리고 분명히 일부는 의사 코드이지만, 내가 찾을 수있는 유일한 접근법이며, 어쨌든 80 %만이 작동 할 것이라고 확신합니다. 분명히 루비는 뭔가 더 깨끗한가?

중요한 것은 "get_command_based_on_user_input()"이 부모 프로세스를 차단하지 않는다는 것입니다. 이것이 내가 자식 프로세스에 갇힌 이유입니다.

+0

당신은 자식 포크에서 cmd를 얻고, exec하고, 터미널 fids를 메인 포크로 돌려 주길 원합니까? –

답변