2011-08-10 133 views
2

我有一個小型的python應用程序,它使用pyttsx來處理某些文本到語音。在eclipse外部運行時,程序無法完全運行

它是如何工作的: 只需說出剪貼板中的任何內容。

該程序在eclipse中按預期工作。但是,如果在cmd.exe上運行,它只會在剪貼板上的文本太大(幾段)時才起作用。爲什麼?

從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) 

感謝

編輯:我已經檢查比使用的Python版本是相同的2.7用於在cmd中運行該程序的命令: python d:\python\play\speech\speechplay.py

+0

「run party」是什麼意思?只是處理剪貼板中的文本的一部分,還是其他內容? –

+0

它將文本打印到標準輸出,但不'說'任何東西 –

回答

0

事實上,eclipse本身使用命令行命令啓動它的應用程序。

您應該檢查eclipse爲啓動程序而給出的命令。它可能有點冗長,但你可以從那裏開始測試什麼是必要的,什麼不是。

通過運行該程序,然後在調試窗口中選擇輸出,您可以找到命令行eclipse的使用。右鍵點擊它,選擇屬性,你就完成了。

如果你沒有調試窗口,你可以打開窗口/顯示視圖/(其他可能)/調試。

+0

ok eclipse正在使用'python.exe -u file.py'。所以我嘗試了它,但得到了相同的結果 –

+0

我想這兩個exe和file.py的路徑?如果您完全複製粘貼,會發生什麼情況? – Peter

+0

是的,路徑相同。我粘貼的eclipse編碼完全。 –

2

檢查問題不在從剪貼板中讀取文本的代碼中。

您應該檢查您的eclipse設置是否爲不在Eclipse之外的項目指定了自定義環境變量。尤其是:

  • PYTHONPATH(還有更多的項目上,你的程序也會取決於你的設置)
  • PATH

使用

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

在程序的開頭比較這兩個設置。

其它文體建議:

  • 不使用os._exit,喜歡sys.exit(你只應該在一個子進程使用os._exitos.fork一個電話,這是不是適用於Windows後)

  • 我認爲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