2017-05-06 10 views
-1

私は、remote_pdbentrをPython 3マルチプロセッシングアプリケーションの迅速なテストと開発の環境として一緒に使用する方法を見つけようとしていますが、私は、ファイル、たとえば、 'mp.py' と実行し、それに保存した場合エンティティの制御下で実行されるデバッグ子プロセス

import time 
from multiprocessing import Process 
from remote_pdb import RemotePdb 
def child(): 
    RemotePdb('localhost', 4444).set_trace() 
    while True: 
     print("I am the child") 
     time.sleep(1) 
proc = Process(target=child) 
proc.start() 
proc.join() 

python mp.py

それが動作

は以下の些細なテストケースを考えてみましょうとても良く。それは

CRITICAL:root:RemotePdb session open at 127.0.0.1:4444, waiting for connection ... 
RemotePdb session open at 127.0.0.1:4444, waiting for connection ... 

を表示し、子プロセスでは、予想通り、破壊し、私はnetcatをまたはsocatに関する、と別の端末セッションから接続して、Pythonのデバッガを使用することができます。デバッガを終了すると、子と親が明示的に終了するまで実行されません。

私は今、それは私がmp.pyを編集して、自動クリーン再起動私は保存するたびに取得することができますRemotePdb()の呼び出しをコメントアウトし、

ls mp.py | entr -r python mp.py 

entrの制御下でスクリプトを実行した場合。

問題は、RemotePdb()呼び出しのコメントを外すときに発生します。

スクリプトは、以前と同じ '接続待ち'メッセージを表示している子を中断しますが、別の端末ウィンドウでnetcatと接続しようとすると、pdbセッションは応答なしecho - CRに応答して空行だけを表示します。 socatと同じ結果が得られます。

私はOS X 10.11.6でpython 3.5.3、entr 3.7、remote_pdb 1.2を使って開発しています。

私は何を求めています: 私はentrremote_pdbまたはそれを行うことができない理由明確な説明の利点を組み合わせ、コマンド・ライン・ソリューションを提供して答えを受け入れるだろう。

ありがとうございます!

更新 さらなる試験

ls mp.py | entr python mp.py 

が動作するデバッガ接続を許可する、すなわち、ENTRに-r(再起動)オプションは、問題を生じさせるのに必要であることを示しています。残念ながら、再起動オプションはワークフローにとって不可欠です。

更新2:この問題は、プロセスグループの設定に関連しているようです。これはすべての子プロセスが強制終了されることを確認するためにentr -rによって行われます。 entrを置き換えるPythonスクリプトを試行している間に、スクリプトがIPythonシェル(!python mp.py)から起動された場合でも、親プロセスで同じエラー(デバッガにI/Oなし)開始はbashです。

更新3:remote_pdbの著者と私は、Linuxで問題が発生していないことを個別に確認しました。これはOS Xの問題で、明らかにPythonソケットとプロセスグループと関係しています。私はそれに応じてタグに追加しました。

+0

説明コメントを残さずにダウンワードしても意味がありません。 –

答えて

0

解決済み!これは古いOS XのPythonの問題です。Pdbに戻ったり、Pdbで修正されたりしていません。この修正は、readlineをインポートする前にSIGTTOUを無視するように設定することです。詳細はhttp://bugs.python.org/issue14892を参照してください。

次のように、pdb.Pdbのローカルコピーにパッチを当てて問題を解決しました。 ionelmc

class Pdb(bdb.Bdb, cmd.Cmd): 

    _previous_sigint_handler = None 

    def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None, 
       nosigint=False): 
     bdb.Bdb.__init__(self, skip=skip) 
     cmd.Cmd.__init__(self, completekey, stdin, stdout) 
     if stdout: 
      self.use_rawinput = 0 
     self.prompt = '(Pdb) ' 
     self.aliases = {} 
     self.displaying = {} 
     self.mainpyfile = '' 
     self._wait_for_mainpyfile = False 
     self.tb_lineno = {} 
     # Try to load readline if it exists 
     try: 
############ FIX OSX BUG ###################################### 
      import sys 
      if sys.platform == 'darwin': 
       import signal 
       signal.signal(signal.SIGTTOU, signal.SIG_IGN) 
############ END FIX ########################################## 
      import readline 
      # remove some common file name delimiters 
      readline.set_completer_delims(' \t\n`@#$%^&*()=+[{]}\\|;:\'",<>?') 
     except ImportError: 
      pass    

多くのおかげで、寛大な助けが問題を追跡するためremote_pdbhunterの著者。