2012-11-18 6 views
21

शैल से चलाने के लिए एक साधारण पायथन स्क्रिप्ट में, क्या मैं विश्वसनीय रूप से निर्धारित कर सकता हूं कि sys.stdin को किसी अन्य प्रक्रिया से वास्तविक फ़ाइल बनाम पाइप किया गया है या नहीं?मैं कैसे निर्धारित करूं कि sys.stdin को किसी अन्य प्रक्रिया से पाइप किए गए फ़ाइल बनाम से रीडायरेक्ट किया गया है या नहीं?

मैं रनटाइम व्यवहार को बदलना चाहता हूं, इस पर निर्भर करता है कि डेटा फ़ाइल बनाम stdin किसी अन्य प्रक्रिया से एक पाइप के माध्यम से स्ट्रीमिंग कर रहा है या नहीं।

अपेक्षित, isatty() दोनों मामलों में झूठा रिटर्न देता है।

# test.py 
import os 
import sys 
print sys.stdin.isatty() 
print os.isatty(sys.stdin.fileno()) 

परीक्षण::

python test.py < file.txt 

पैदा करता है:

False 
False 

और:

ls -al | python test.py 

पैदा करता है: यहाँ एक त्वरित isatty() परीक्षण है

False 
False 

क्या ऐसा करने की कोई पाइथोनिक विधि है?

यूनिक्स/लिनक्स विशिष्ट ठीक है, हालांकि यह जानना अच्छा होगा कि पोर्टेबल तरीके से ऐसा करना संभव है या नहीं।

संपादित करें: टिप्पणीकर्ताओं के जवाब में नोट: मुझे परवाह क्यों है? खैर, मेरे मामले में, मैं समय-मुद्रित डेटा से निपटना चाहता हूं जो किसी अन्य प्रक्रिया से पाइप होने पर अनियमित अंतराल पर आता है; जब मैं किसी फ़ाइल से प्री-रिकॉर्डेड डेटा वापस चलाता हूं, तो मैं इसे एक निश्चित या परिवर्तनीय देरी का उपयोग करके फिर से खेलना चाहता हूं।

मैं मानता हूँ यह शायद एक क्लीनर विधि का उपयोग करने लाभप्रद है (और मैं, कई के बारे में सोच सकते हैं प्लेबैक धारा में हो रही देरी को सम्मिलित करने के लिए एक मध्यवर्ती स्क्रिप्ट सहित), लेकिन मैं टर्मिनली उत्सुक हूँ।

+0

तुम क्यों महत्वपूर्ण है? क्या यह पूरा मुद्दा नहीं है कि दोनों को अलग-अलग होना चाहिए? 'Ls -al> file.txt && python test.py Eric

+0

मैं दो वातावरण के बीच समय पुन: पेश करना चाहता हूं। तत्काल मामले में मैं test.py में टाइमस्टैम्प किए गए डेटा की लाइनों (अभिलेख) को स्वीकार कर रहा हूं, और फ़ाइल से डेटा को इसी तरह के विलंब के साथ संसाधित करना चाहता हूं, जब मैंने पहली बार डेटा पर कब्जा कर लिया था। – Inactivist

+2

@Eric की टिप्पणी जारी रखते हुए, क्या आपकी स्क्रिप्ट को दो संभावनाओं के साथ लिखना बेहतर नहीं होगा: या तो stdin से पढ़ना, या तर्क के रूप में दी गई फ़ाइल से? –

उत्तर

24

आप stat मैक्रो के लिए देख रहे हैं:

import os, stat 

mode = os.fstat(0).st_mode 
if stat.S_ISFIFO(mode): 
    print "stdin is piped" 
elif stat.S_ISREG(mode): 
    print "stdin is redirected" 
else: 
    print "stdin is terminal" 
+0

बढ़िया! मैंने इसका परीक्षण किया और सत्यापित किया कि यह लिनक्स और विंडोज पर विज्ञापन के रूप में काम करता है। – Inactivist

+0

क्या आपने उत्तर देने से पहले डुप्लिकेट की जांच की है? –

+1

@PiotrDobrogost: मुझे इस के लिए उचित खोज शब्द खोजने में कठिन समय था। यदि आपको सटीक डुप्लिकेट मिल गया है, तो लिंक पोस्ट करने और बंद करने के लिए स्वतंत्र महसूस करें। – georg

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

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