शैल से चलाने के लिए एक साधारण पायथन स्क्रिप्ट में, क्या मैं विश्वसनीय रूप से निर्धारित कर सकता हूं कि 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
क्या ऐसा करने की कोई पाइथोनिक विधि है?
यूनिक्स/लिनक्स विशिष्ट ठीक है, हालांकि यह जानना अच्छा होगा कि पोर्टेबल तरीके से ऐसा करना संभव है या नहीं।
संपादित करें: टिप्पणीकर्ताओं के जवाब में नोट: मुझे परवाह क्यों है? खैर, मेरे मामले में, मैं समय-मुद्रित डेटा से निपटना चाहता हूं जो किसी अन्य प्रक्रिया से पाइप होने पर अनियमित अंतराल पर आता है; जब मैं किसी फ़ाइल से प्री-रिकॉर्डेड डेटा वापस चलाता हूं, तो मैं इसे एक निश्चित या परिवर्तनीय देरी का उपयोग करके फिर से खेलना चाहता हूं।
मैं मानता हूँ यह शायद एक क्लीनर विधि का उपयोग करने लाभप्रद है (और मैं, कई के बारे में सोच सकते हैं प्लेबैक धारा में हो रही देरी को सम्मिलित करने के लिए एक मध्यवर्ती स्क्रिप्ट सहित), लेकिन मैं टर्मिनली उत्सुक हूँ।
तुम क्यों महत्वपूर्ण है? क्या यह पूरा मुद्दा नहीं है कि दोनों को अलग-अलग होना चाहिए? 'Ls -al> file.txt && python test.py
Eric
मैं दो वातावरण के बीच समय पुन: पेश करना चाहता हूं। तत्काल मामले में मैं test.py में टाइमस्टैम्प किए गए डेटा की लाइनों (अभिलेख) को स्वीकार कर रहा हूं, और फ़ाइल से डेटा को इसी तरह के विलंब के साथ संसाधित करना चाहता हूं, जब मैंने पहली बार डेटा पर कब्जा कर लिया था। – Inactivist
@Eric की टिप्पणी जारी रखते हुए, क्या आपकी स्क्रिप्ट को दो संभावनाओं के साथ लिखना बेहतर नहीं होगा: या तो stdin से पढ़ना, या तर्क के रूप में दी गई फ़ाइल से? –