2012-02-07 12 views
25

के माध्यम से stdin पढ़ता है मेरे पास एक पाइथन स्क्रिप्ट है जो एक पाइप के माध्यम से stdin पढ़ती है, और मैं इसे pdb.set_trace() के साथ उपयोग नहीं कर सकता।एक स्क्रिप्ट में pdb.set_trace() का उपयोग करें जो एक पाइप

my_script.py:

#!/usr/bin/env python 
import sys 
import pdb 

def main(): 
    for line in sys.stdin: 
     print "Printing a line: " +line 

if __name__=='__main__': 
    status = main() 

मान लीजिए tempfile.csv, दो पंक्तियों के साथ कुछ फाइल है

$ cat tempfile.csv 
line1 
line2 

तो मैं के साथ मेरी स्क्रिप्ट चला सकते हैं: $ बिल्ली tempfile.csv | अगर मैं pdb.set_trace() डाल कहीं भी तो मैं कोई त्रुटि मिलती है

$ cat tempfile.csv | ./my_script.py 
Printing a line: line1 

Printing a line: line2 

दूसरी ओर,: ./my_script.py, और सब कुछ ठीक है। उदाहरण के लिए, डीईएफ़ मुख्य (नीचे pdb.set_trace() डाल), तो मैं

$ cat tempfile.csv | ./my_script.py 
> /home/ilangmore/mobiuss/TM/branches/hadooprotype/my_script.py(7)main() 
-> for line in sys.stdin: 
(Pdb) *** NameError: name 'line1' is not defined 
(Pdb) *** NameError: name 'line2' is not defined 
(Pdb) 
Traceback (most recent call last): 
    File "./my_script.py", line 11, in <module> 
    status = main() 
    File "./my_script.py", line 7, in main 
    for line in sys.stdin: 
    File "./my_script.py", line 7, in main 
    for line in sys.stdin: 
    File "/usr/lib/python2.7/bdb.py", line 48, in trace_dispatch 
    return self.dispatch_line(frame) 
    File "/usr/lib/python2.7/bdb.py", line 67, in dispatch_line 
    if self.quitting: raise BdbQuit 
bdb.BdbQuit 

ध्यान दें कि मेरे सवाल का शायद this question से संबंधित है (अर्थात pdb डिफ़ॉल्ट रूप से stdin से पढ़ता है), लेकिन मैं और अधिक मदद की जरूरत है।

उत्तर

3

बात यह है: cat डेटा भेजने से नहीं रोक पाएगा क्योंकि आपकी स्क्रिप्ट वर्तमान में डिबगिंग कर रही है। और जब आप ट्रेस करने जा रहे हैं, तो stdin अभी भी cat + आपके कीबोर्ड से भरा हुआ है। आपको उनमें से एक को चुनने की जरूरत है।

आप पूरी stdin पढ़ सकते हैं, और फिर, set_trace() stdin से नहीं भरा जाएगा:

sys.stdin.read() 
pdb.set_trace() 
+2

यह मदद करने के लिए प्रतीत होता है लेकिन पूरी तरह से नहीं। मैंने sys.stdin.read() को कुछ स्थानों में, और pdb.set_trace() नीचे रखा है, और अब मुझे NameError नहीं मिला है। हालांकि, पीडीबी नहीं खुलता है ... यह अभी निकलता है (ऊपर जैसा ही संदेश, नाम त्रुटि के बिना) –

2

आप कैसे अजवाइन RDB (रिमोट डिबगर) योगदान मॉड्यूल काम करता है को देखने के लिए चाहते हो सकता है:

https://github.com/celery/celery/blob/master/celery/contrib/rdb.py

यह स्ट्रीम प्रसंस्करण का एक बहुत शामिल करने के लिए लगता है, लेकिन मैं इसे का परीक्षण किया है, और यह आप एक नया स्थानीय नेटवर्क पोर्ट में टेलनेट करने की अनुमति देकर काम करता है। यह आईपीडीबी बेहतर नहीं है, लेकिन बस पीडीबी।

1

आज मैं इस सटीक समस्या में भाग गया। मैंने पाया कि Winpdb पूरी तरह से काम करता है।

lines = sys.stdin.readlines() 
sys.stdin = open('/dev/tty') 
pdb.set_trace() 
+0

आप इस मामले में winpdb कैसे आते हैं? –

13

यहाँ क्या मेरे लिए काम किया, इसका एक उदाहरण।

+0

मुझे एक ही समस्या थी और यह बहुत अच्छा काम किया। किसी को पता है क्यों? – unclejamil

+3

पीडीबी स्टडीन से इंटरैक्टिव होने के लिए पढ़ता है; तो पीडीबी का उपयोग करने के लिए आपको पहले सभी stdin पढ़ना होगा, फिर टेडटाइप इंटरफ़ेस होने के लिए stdin सेट करें या अन्य शब्दों में इसे खोलें और शैल पाइप के बजाय कीबोर्ड पर वापस हुक करें। उस बिंदु पर आप पीडीबी सामान्य (और इसका उपयोग करें) – ThorSummoner

+1

शुरू कर सकते हैं मैंने उपयोग किया: 'आयात sys; sys.stdin = खुला ('/ dev/tty'); आयात पीडीबी; pdb.set_trace() ' –

2

ripdb मॉड्यूल (pip install ripdb) का उपयोग करना मेरे लिए इस मुद्दे को हल:

संबंधित मुद्दे