2016-12-02 7 views
3

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>を参照していますが、これは役に立ちません。例外が実際にどこで発生しているのか、どうすればわかりますか?

# 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() 
+1

'ファイル" "の部分は、コマンドラインからPython -cを使って直接Pythonコードスニペットを実行することができます。いくつかのコードはここにあります。 '。あなたはランチャースクリプトのどこにいてもやっていますか? –

+0

それは確かにそれがどのように見えるのですが、私はそれをしていないことをあなたに保証することができます。他のトレースバック私は正常に見える。 –

+1

あなたのコードで潜在的に問題となるのは、Windows上で 'multiprocessing'を使うためには、メインプロセスのコードを' if __name__ == '__main __': 'ブロックに入れる必要があるということです。 [_multiprocessingプログラミングのガイドライン_](https:/ /)の[Windows](https://docs.python.org/2/library/multiprocessing.html#windows)セクションの**メインモジュールの安全なインポート**サブセクションを参照してください。 /docs.python.org/2/library/multiprocessing.html#programming-guidelines)。 – martineau

答えて

0

私はまだ私はなっていたトレースバックを理解していないが、私は変更することにより、例外を中心に働いた:ここ

は、私はそれが私がmultiprocessingを使用する唯一の場所だと、責任でなければならないと思う方法です:

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

はい、I LOこの方法では、スクリプトは既に良いターミナルの不足のためにWindowsで不自由しています。

関連する問題