Quelle est la source de mon exception?

J’ai un script Python 3 qui fonctionne correctement sous Linux. Quand je l’exécute sous Windows, j’obtiens la trace suivante chaque fois que j’essaie de jouer un son:

Traceback (most recent call last): File "", line 1, in  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 

J’ai regardé le code que je pense être responsable de cela, mais je ne vois pas en quoi le multiprocessing est même pertinent ici, car j’ai déjà attrapé EOFError, ou alors il me semble. (Notez que cette exception ne provoque pas la sortie de mon script.)

Mon plus gros problème est qu’il n’ya aucune information sur l’endroit où Python pense que le problème est survenu. Il fait référence au File "", line 1, in , ce qui est inutile. Comment puis-je savoir où l’exception est réellement soulevée?

Voici la méthode que je pense devoir être responsable, car c’est le seul endroit où j’utilise le 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 (AtsortingbuteError, EOFError): play_sound() 

Je ne comprends toujours pas la trace que je recevais, mais j’ai contourné l’exception en changeant:

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

Oui, je perds la fonctionnalité de cette façon, mais le script est déjà paralysé sous Windows en raison de l’absence d’un bon terminal. (Et que je n’ai pas vraiment une compréhension profonde de Windows.)