python - 我的异常来源是什么?

标签 python windows

我有一个在 Linux 中运行良好的 Python 3 脚本。当我在 Windows 下运行它时,每次我尝试播放声音时都会得到以下回溯:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Program Files (x86)\Python35-32\lib\multiprocessing\spawn.py", line 106, in spawn_main
    exitcode = _main(fd)
  File "C:\Program Files (x86)\Python35-32\lib\multiprocessing\spawn.py", line 116, in _main
    self = pickle.load(from_parent)
EOFError: Ran out of input

我查看了我认为可能对此负责的代码,但我看不出如何 multiprocessing在这里甚至是相关的,因为我已经捕获了 EOFError,或者在我看来是这样。 (请注意,此异常不会导致我的脚本退出。)

我最大的问题是没有关于 Python 认为问题发生在哪里的信息。它指的是File "<string>", line 1, in <module> ,这是无益的。我怎样才能弄清楚实际引发异常的位置?

这是我认为必须负责的方法,因为这是我唯一使用的地方multiprocessing :

# imported earlier:
import multiprocessing as mp

def _play(self, name):
    '''Plays the sound given by name'''
    if self.silent:
        return True
    def play_sound(q=None):  # Called in a separate process so playing the sound doesn't block anything else.
        '''q is a multiprocessing.Queue object for interprocess communication.'''
        try:
            snd = self.sounds[name]
            if self._use_subprocess:
                s = subprocess
                return s.call([self.player, snd], stdout=s.DEVNULL, stderr=s.DEVNULL, timeout=20)
            else:
                return self.player(snd, self._winsound_options)
        except (KeyboardInterrupt, EOFError):
            sys.exit(0)
        except subprocess.TimeoutExpired as e:
            #if q:
            #    q.put(e)
            sys.stderr.write('\nSOUND ERROR: Unable to play the sound "{}": Timeout expired.\n\n'.format(snd))
            sys.exit(1)
        except FileNotFoundError:
            sys.stderr.write('\nSOUND ERROR: Unable to locate the sound player "{}".\n\n'.format(self.player))
            sys.exit(2)
        except EOFError:
            pass
    #q = mp.Queue()
    proc_name = 'Play sound: {}; time: {}'.format(name, datetime.datetime.now().strftime('%I:%M:%S %p'))
    try:
        proc = mp.Process(target=play_sound, name=proc_name)#, args=(q,))
        proc.start()
    # On Windows, multiprocessing attempts to pickle this method, which fails
    # because it's called by an inner function defined in __getattr__. We'll
    # Skip using multiprocessing in this case.
    # References: https://github.com/ouspg/trytls/issues/196 and http://stackoverflow.com/a/36995008/713735
    except (AttributeError, EOFError):
        play_sound()

最佳答案

我仍然不明白我得到的回溯,但我通过更改来解决异常:

proc = mp.Process(target=play_sound, name=proc_name)
proc.start()

到:

if os.name == 'nt':
    play_sound()
else:
    proc = mp.Process(target=play_sound, name=proc_name)
    proc.start()

是的,我失去了这种方式的功能,但由于缺乏良好的终端,该脚本在 Windows 上已经瘫痪。 (而且我对 Windows 并不是很了解。)

关于python - 我的异常来源是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40937893/

相关文章:

windows - 在 Windows 上使用 Bash 时如何在 Fish 中显示完整目录?

python - 如何使用 Linux 将程序的输出重定向到 .txt 文件

python - 使用 Openpyxl 保存启用宏的 Excel 工作簿 (.xlsm) 时出现问题。 Excel 引发错误并开始修复工作簿

python - 如何在 Django 中以编程方式呈现和缓存 View ?

windows - 如何在没有开发工具的情况下以边缘模式运行 IE?

windows - 是否可以将 Ruby 脚本转换为 .exe 以便源代码不可见?

c++ - 全局安装的键盘钩子(Hook)防止键盘输入到其他应用程序

c# - 使用 P/Invoked GlobalSize 时堆已损坏

python - ctrl+B 不适用于 sublimetext2 中的 python

python - 在 Rexster 中测试从 Groovy 命令行创建顶点