2016-11-01 9 views
1

どのように私ができるセットアップPythonのIDEとの統合とホットプラグリモートデバッガ?たとえば、PyCharmを使用します。私は、hotpluggableという意味で:接続して、飛行機のdevサーバーから切断することができます。リモートホットプラグPythonのデバッガ

私はクラウド(django、nginx、uwsgi、postgres、debian)にdevサーバを持っていて、PyCharmをメインIDEとして使用しています(他のIDEの解決策があればそれを入力してください)。

時々、私はdevのサーバーを再起動/停止することなく、スクリプトを接続してデバッグする必要があります。 PyCharmのデバッガ(pydevd)を使用して、DEVサーバは、デバッガサーバー(Connection refused)の作業をせずに開始することができない、とのdevのサーバーが稼働している間、私は、リモートデバッガを停止した場合、それは例えばクラッシュ

An existing connection was forcibly closed by the remote host 

pdg/epdgが見つかりましたが、PyCharmとの統合はありません。 PyCharmには「Attach to process」という素晴らしい機能がありますが、ローカルプロセスでのみ機能します。

答えて

1

おそらくうまくいく基本的なアプローチは、デバッガにロードするデバッグしたいプログラムにシグナルハンドラを設定することです。その後、プロセスにデバッグする信号(killコマンドを使用)を送信すると、リモートで接続できます。出力以上のことから

$ python /tmp/foo.py 
8530 

私たちは親切に私達がデバッグするPythonのプロセスのPIDを記載されている。ここで

は、あなたが今python trepandebuggers

import signal 

def signal_handler(num, f): 
    from trepan.interfaces import server as Mserver 
    from trepan.api import debug 
    connection_opts={'IO': 'TCP', 'PORT': 1955} 
    intf = Mserver.ServerInterface(connection_opts=connection_opts) 
    dbg_opts = {'interface': intf} 
    print('Starting TCP server listening on port 1955.') 
    debug(dbg_opts=dbg_opts) 
    return 

signal.signal(signal.SIGUSR1, signal_handler) 
# Go about your business... 

import time 
import os 
print(os.getpid()) 
for i in range(10000): 
    time.sleep(0.2) 

経由でこれを行うことを実行したい方法です。

は今シェルで、私たちは、シグナルハンドラに設定されているデバッガに入るための処理を指示する信号を送ります。 プロセスIDを調整する必要があります。

$ kill -USR1 8530 # Adjust the pid to what you see above 

そして、我々はあなたが今 新しい出力表示されるはずです/tmp/foo.pyを実行したシェルで:戻る私たちはkill -USR1を発行したシェルに

$ python /tmp/foo.py 
8530 
Starting TCP server listening on port 1955. # This is new 

を、我々は今、プロセスは現在の内部停止添付するデバッガ:偉大な答えを

$ trepan2 --client --port 1955 
Connected. 
(/tmp/foo.py:11 @101): signal_handler 
-- 11  return 
(trepan2*) list 
    6   connection_opts={'IO': 'TCP', 'PORT': 1955} 
    7   intf = Mserver.ServerInterface(connection_opts=connection_opts) 
    8   dbg_opts = {'interface': intf} 
    9   print('Starting TCP server listening on port 1955.') 
10   debug(dbg_opts=dbg_opts) 
11 ->  return 
12 
13  signal.signal(signal.SIGUSR1, signal_handler) 
14  # Go about your business... 
(trepan2*) backtrace 
-> 0 signal_handler(num=10, f=<frame object at 0x7f9036796050>) 
     called from file '/tmp/foo.py' at line 11 
## 1 <module> file '/tmp/foo.py' at line 20 
+0

ありがとう! –

関連する問題