2011-08-10 3 views
2

저는 작은 파이썬 응용 프로그램이 있습니다.이 응용 프로그램은 일부 텍스트에 pyttsx를 사용합니다.이클립스 외부에서 실행될 때 프로그램이 완전히 작동하지 않습니다.

작동 방식 : 클립 보드에 무엇이 있더라도 간단히 말하면됩니다.

이클립스 내부 프로그램이 예상대로 작동합니다. 그러나 cmd.exe에서 실행하면 클립 보드의 텍스트가 너무 크면 (일부 paras) 부분적으로 만 작동합니다. 왜 ?

는 cmd를에서 실행하면 문을 출력하지만, 클립 보드의 텍스트가 여기에

실제로 이야기를 수행하는 프로그램 부분의 너무 큰 경우 실제는 (작동하지 않는 '이야기'할 수있는 볼 수있는 '이야기'부분은 스레드 내부에서 처리 할 수 ​​

def saythread(queue , text , pauselocation, startingPoint): 
    saythread.pauselocation = pauselocation 
    saythread.pause = 0 
    saythread.engine = pyttsx.init()  
    saythread.pausequeue1 = False 

    def onWord(name, location, length):  
     saythread.pausequeue1 = queue.get(False) 
     saythread.pause = location 
     saythread.pauselocation.append(location) 

     if saythread.pausequeue1 == True : 
      saythread.engine.stop() 

    def onFinishUtterance(name, completed): 
     if completed == True: 
      os._exit(0)    

    def engineRun(): 

     if len(saythread.pauselocation) == 1: 
      rate = saythread.engine.getProperty('rate') 
      print rate 
      saythread.engine.setProperty('rate', rate-30) 
     textMod = text[startingPoint:] 

     saythread.engine.say(text[startingPoint:]) 
     token = saythread.engine.connect("started-word" , onWord) 
     saythread.engine.connect("finished-utterance" , onFinishUtterance) 
     saythread.engine.startLoop(True) 

    engineRun() 

    if saythread.pausequeue1 == False: 
     os._exit(1) 


def runNewThread(wordsToSay, startingPoint):  
    global queue, pauselocation 
    e1 = (queue, wordsToSay, pauselocation, startingPoint) 
    t1 = threading.Thread(target=saythread,args=e1) 
    t1.start() 

#wordsToSay = CLIPBOARD CONTENTS 
runNewThread(wordsToSay,0) 

감사

편집 :. 나도 같은 2.7이다 사용 파이썬 버전보다 확인하신 후 cmd를에서 프로그램을 실행하는 데 사용되는 명령을 사용합니다. : python d:\python\play\speech\speechplay.py

+0

"러닝 파티"란 무엇을 의미합니까? 처리 된 클립 보드의 텍스트 일부입니까? 아니면 다른 것입니까? –

+0

그것은 STDOUT에 텍스트를 출력하지만, 아무 것도 말하지 않습니다. –

답변

0

실제로 eclipse 자체는 명령 행 명령을 사용하여 응용 프로그램을 시작합니다.

프로그램을 시작하기 위해 Eclipse가 제공하는 명령을 확인해야합니다. 조금 자세하게 설명 할 수는 있지만 여기서 시작하여 필요한 부분과 그렇지 않은 부분을 테스트 할 수 있습니다.

프로그램을 실행 한 다음 디버그 창에서 출력을 선택하여 Eclipse에서 사용하는 명령 행을 찾을 수 있습니다. 마우스 오른쪽 버튼으로 속성을 선택하면 완료됩니다.

디버그 창이없는 경우에는 window/show view/(기타 가능)/debug를 열 수 있습니다.

+0

ok eclipse는'python.exe -u file.py'를 사용하고 있습니다. 그래서 그것을 시도했지만, 같은 결과를 얻었다. –

+0

또한 exe와 file.py에 대한 경로가 있다고 생각 하나? 정확하게 붙여 넣기하면 어떻게됩니까? – Peter

+0

네, 동일한 경로. 나는 정확하게 코딩 된 일식을 붙여 넣었다. –

2

클립 보드에서 텍스트를 읽는 코드에 문제가 없는지 확인했습니다.

이클립스 설정에 Eclipse 외부에 존재하지 않는 프로젝트의 사용자 환경 변수가 지정되어 있는지 확인해야합니다. 특히 :

  • PYTHONPATH 비교하는 프로그램의 시작 부분에
  • PATH

사용

import os 
print os.environ['PATH'] 
print os.environ['PYTHONPATH'] 

(및 추가 프로젝트가있는 프로그램은 설정에 따라 수) 두 설정.

기타 문체 조언 :

  • os._exit를 사용하지 않는이,

  • (당신은 Windows에서만 사용할 수 없습니다 os.fork를 호출 후에 자식 프로세스에서 os._exit를 사용한다) sys.exit 선호

    나는 threading.Event이 더 적합 할 것이라고 생각한다. queue.Queue

  • 나는 subc 내부 기능 예를 들어

와 방법에 실보다는 기능 아가씨 접근 방식 :

import threading 
import sys 
import pyttsx 

class SayThread(threading.Thread): 

    def __init__(self, queue, text, pauselocation, startingPoint, debug=False): 
     threading.Thread.__init__(self) 
     self.queue = queue 
     self.text = text 
     self.pauselocation = pauselocation 
     self.startingPoint = startingPoint 
     self.pause = 0 
     self.engine = pyttsx.init(debug=debug) 
     self.pausequeue1 = False 

    def run(self): 
     if len(self.pauselocation) == 1: 
      rate = self.engine.getProperty('rate') 
      print rate 
      self.engine.setProperty('rate', rate-30) 
     textMod = self.text[self.startingPoint:] 
     self.engine.say(self.text[self.startingPoint:]) 
     self.engine.connect("started-word", self.onWord) 
     self.engine.connect("finished-utterance", self.onFinishUtterance) 
     self.engine.startLoop(True) 
     if self.pausequeue1 == False: 
      sys.exit(1) 

    def onWord(self, name, location, length): 
     self.pausequeue1 = self.queue.get(False) 
     self.pause = location 
     self.pauselocation.append(location) 
     if self.pausequeue1 == True : 
      self.engine.stop() 

    def onFinishUtterance(self, name, completed): 
     if completed == True: 
      sys.exit(0) 


def runNewThread(wordsToSay, startingPoint): 
    global queue, pauselocation 
    t1 = SayThread(queue, wordsToSay, 
          pauselocation, startingPoint) 
    t1.start() 

#wordsToSay = CLIPBOARD CONTENTS 
runNewThread(wordsToSay,0) 
-2

은 PYTHONPATH가 내 시스템에 제대로 설정되지 않은 밝혀졌습니다. 편집 : pythonpath가 문제가되지 않습니다. 나는 그 문제가 뭔지 전혀 모른다. arghhhhhhhhhhhhhhhhhhhhhhhh

관련 문제