2014-07-18 4 views
1

더 큰 C++ 프로그램의 일부인 Python 플러그인을 구현 중입니다. 이 프로그램의 목적은 사용자가 Python으로 명령의 동작을 입력 할 수있게하는 것입니다. 현재 C++ 함수에서 문자열을 받고 exec() 함수를 통해 실행합니다. 그런 다음 사용자는 API를 사용하여 더 큰 C++ 프로그램의 변경 사항에 영향을 줄 수 있습니다.Python에서 실행 일시 중지

현재 작업하고있는 기능은 일시 중지 실행 기능입니다. 코드 실행 및 모든 로컬 변수의 상태를 기억하고 조건이 충족되면 실행을 다시 시작해야합니다. 파이썬에 대해 잘 알고 있지는 않습니다.이 기능을 구현하는 방법에 대한 조언이 필요합니다. 내 첫 번째 디자인 아이디어 :

1) yield 명령 사용. 이것은 처음에는 좋은 생각 인 것 같았습니다. 다음 명령을 사용할 때 필요한 모든 것을 기억합니다.하지만 문제는 호출 스택의 이전 수준으로 만 수익률이 반환된다는 것입니다. 따라서 사용자가 함수를 호출하면 함수는 더 큰 C++ 프로그램이 아니라 사용자 코드로 돌아갑니다. 늘어나는만큼 스택에 yield 명령을 전파 할 방법이 없다는 것을 알 수 있습니다 ???

2) 스레딩 각 명령에 대한 스레드를 만드는 기본 파이썬 스레드를 만듭니다. 이 주 스레드는 실행 된 각 명령에 대한 스레드를 생성하고 완료되면이를 종료합니다. 일시 중지했다가 다시 시작해야하는 경우 잠금 대기열을 통해 그렇게 할 수 있습니다.

그 두 가지 옵션은 내가 생각해 낸 유일한 옵션이었습니다. yield 함수가 작동하는지 또는 그것이 설계된 것인지 확실하지 않습니다. 스레딩 방식이 효과적 일지는 몰라도 과잉이라고 생각하고 개발하는 데 오랜 시간이 걸릴 것으로 생각합니다. 또한 파이썬에서 일종의 Task Module을 찾고 있었지만 찾고 있던 것을 정확히 찾을 수 없었습니다. 파이썬에 익숙하지 않은 사람이 있다면 다른 제안이 있는지 궁금합니다.

편집 : 의견에서 언급 한대로 스크립트가 "일시 중지"될 때 어떤 일이 발생해야하는지 설명하지 않았습니다. 파이썬 플러그인은 C++ 프로그램이 계속 실행되도록 허용해야합니다. 내 마음 속에서 이것은 A) 단일 쓰레드 접근법에 대해 말하고 있다면 리턴한다. B) 메시지를 함수 호출로 보낸다. 나는 현재 존재하는 것에 대한 더 나은 진술을 가지고 있으며 sudo 코드를 제공 할뿐만 아니라 어떤 일이 일어나야하는지에 대한 또 다른 포스트를 만들 것이다. Stack Overflow에 익숙하지 않아서 이것이 적절한 응답이 아니면 알려주십시오.

+2

나는 개별 단어를 이해하지만, 의사 코드 또는 무언가로 질문을 표현해야한다고 생각한다. 나는 당신의 질문이 무엇인지 이해하지 못한다.'time.sleep'는 파이썬 스크립트를 일시 정지시킬 것이다. 그러나 Im는 당신이 여기에서 묻고있는 것이지 꽤 thats가 아니다라고 확신한다 –

+0

나는 그것을 두 번째로한다. 일정 시간 동안 스크립트를 일시 중지하는 것만으로는 달성 할 수없는 것이 무엇인지 설명해야합니다. 현재 당신이하려는 일을 정확하게 파악하는 것은 어렵습니다. – JBentley

+0

문제점 신고서에 기재 할 내용을 명확히하는 데 도움을 주셔서 감사합니다. – Brian

답변

0

C 프로그램과 통신해야하는 경우 소켓을 사용하는 것이 좋습니다. 당신의 두 프로그램의

https://docs.python.org/2/library/socket.html

하나는 소켓 서버 및 소켓 클라이언트로의 다른 커넥트 역할을합니다. C++ 프로그램을 계속 진행하려면 socket.send()을 사용하여 계속 메시지를 전송하십시오. 그런 다음 파이썬 프로그램은 socket.recv()을 사용하여 C++ 프로그램에서 메시지를 수신 할 때까지 대기합니다.

서로 신호를 보내려면 두 개의 프로그램이 필요한데, 아마도 이것이 가장 안전한 방법 일 것입니다.

2

신호가 파이썬으로 전송 될 때마다, 사용되는 신호 처리기 기능이 끝날 때까지 실행이 즉시 일시 중지됩니다. 그 시점에서 실행은 중단 된 부분부터 계속됩니다. 내 제안은 사용자 정의 신호 (signal.SIGUSR1signal.SIGUSR2) 중 하나를 사용하는 것입니다.프로그램의 시작 부분에서

https://docs.python.org/2/library/signal.html

을 그렇게 같은 신호 처리기 함수를 정의하는 것 : 여기 signal 문서를 살펴 보자 어딘가에 메인 프로그램에서 다음

def signal_pause(signum, frame): 
    if signum == signal.SIGUSR1: 
    # Do your pause here - function processing, etc 
    else: 
    pass 

을, 방금 생성 한 신호 처리기의 기본 신호 처리기를 전환합니다.

signal.signal(signal.SIGUSR1, signal_pause) 

마지막으로 당신이해야 할 무엇이든 할 수있는 signal_pause 기능,

os.kill(os.getpid(),signal.SIGUSR1) 

에 코드를 즉시 일시 중지 상태를 저장하고, 머리 : 당신이 그렇게 같은 SIGUSR1 신호를 보내드립니다, 일시 중지합니다. 이 함수가 종료되면 정상적인 프로그램 실행이 다시 시작됩니다.

편집 : 이것은 프로그램을 일시 중지하는 동안 정교한 작업을 수행한다고 가정합니다. 몇 초간 기다리거나 사용자 입력을 요구하는 경우, 훨씬 쉬운 방법이 있습니다 (각각 time.sleep 또는 input).

EDIT EDIT : 이것은 사용자가 유닉스 시스템을 사용하고 있다고 가정합니다.

+0

답변 해 주셔서 감사합니다! 이는 이상적인 솔루션이지만이 시스템은 여러 플랫폼에 배포됩니다. OS 호출없이 작동하는 솔루션이 필요하다고 생각합니다. – Brian

+0

@ 브라이언 아, 알았어. 아마도 소켓 연결이 더 중요할까요? 계속하기 위해 C++ over 소켓에 메시지를 보내고 파이썬 스크립트가 계속되기 전에 응답을 기다리십니까? 나는 그것들이 얼마나 보편적인지 모르지만 프로세스 간 의사 소통의 표준이다. – TheSoundDefense

관련 문제