在eclipse之外运行时程序不能完全运行

时间:2011-08-10 07:42:19

标签: python eclipse

我有一个小的python应用程序,它使用pyttsx进行一些文本到语音。

工作原理: 只需说出剪贴板中的任何内容。

该程序在eclipse中按预期工作。但是如果在cmd.exe上运行它只能部分工作,如果剪贴板上的文字太大(几个段落)。为什么?

从cmd运行时,它会打印语句,但实际上是在说#39;没有工作(如果剪贴板文字太大

以下是实际进行谈话的节目部分:可以看出'谈话' part在一个线程内处理。

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

中运行程序的命令

3 个答案:

答案 0 :(得分:2)

检查问题是否在从剪贴板中读取文本的代码中。

您应该检查您的eclipse设置是否为Eclipse外部不存在的项目指定了自定义环境变量。特别是:

  • PYTHONPATH(以及您的程序可能依赖于您的设置的其他项目)
  • PATH

使用

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

在程序开头比较两个设置。

杂项风格建议:

  • 不要使用os._exit,更喜欢sys.exit(在调用os._exit之后,您应该只在子进程中使用os.fork,这是不可用的在Windows上)

  • 我认为threading.Eventqueue.Queue

  • 更合适
  • 我使用子类方法为线程提供方法而不是具有内部函数的函数

例如:

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)

答案 1 :(得分:0)

事实上,eclipse本身使用命令行命令来启动它的应用程序。

你应该检查eclipse给启动程序的命令。它可能有点冗长,但你可以从那里开始测试必要的和不需要的东西。

您可以通过运行程序然后在调试窗口中选择输出来找出eclipse使用的命令行。右键单击它,选择属性,然后就完成了。

如果您没有调试窗口,可以打开它窗口/显示视图/(其他可能)/ debug。

答案 2 :(得分:-2)

结果证明pythonpath没有在我的系统上正确设置。 编辑:结果是pythonpath不是问题所在。我不知道这个问题是什么。 arghhhhhhhhhhhhhhhhhhhhhhhh