2013-09-27 6 views
9

मुझे पाइथन के os.path.getmtime() फ़ंक्शन के साथ त्वरित समस्या है। मैंने कुछ अजीब व्यवहार देखा है। मैं एक ऐसे वेब ऐप पर काम कर रहा हूं जो यह देखने के लिए समय-समय पर जांच करता है कि कोई निश्चित फ़ाइल संशोधित की गई है और यह तय करता है कि उस पर आधारित रीफ्रेश करना है या नहीं।पायथन os.path.getmtime() समय बदल नहीं रहा

मेरी स्थानीय पायथन कमांड लाइन में, जब मैं फ़ाइल बदलता हूं और os.path.getmtime(file_name) पर कॉल करता हूं तो mtime से वापसी मूल्य फ़ाइल में परिवर्तन को प्रतिबिंबित करने के लिए बदल गया है।

हालांकि, जब मैं अपने वेब ऐप में os.path.getmtime() पर कॉल करता हूं तो परिवर्तन से पहले और बाद में वापसी मूल्य समान होता है। मैंने ऑनलाइन कुछ शोध किया और कुछ सामान पाया कि यह रिपोर्ट करने के लिए ओएस मॉड्यूल को फ़ाइल में बदलने के लिए पुनः लोड किया जाना चाहिए। तो, मेरे वेब ऐप में मैंने os मॉड्यूल को फिर से लोड किया, लेकिन mtime अभी भी फ़ाइल में बदलावों को प्रतिबिंबित नहीं करता है। समाधान से पहले या किसी और को इस समस्या का सामना करना पड़ा है? मैंने वेबपैप से नीचे एक कोड स्निपेट शामिल किया है:

import os 

def function_name(): 
    reload(os) 
    file_path = '/dir/lib/some_file.js' 

    try: 
     mtime = os.path.getmtime(file_path) 
    except os.error: 
     pass 

    return mtime 
+1

नहीं, 'ओएस' मॉड्यूल को पुनः लोड करने के लिए ** कुछ भी नहीं है ** इसके साथ करने के लिए। –

+0

आह, ठीक है। हाँ मैंने एक पायथन दस्तावेज़ों में से एक में पढ़ा है कि 'os.environ' केवल तभी सेट होता है जब ओएस मॉड्यूल लोड हो जाता है और मैंने सोचा कि उसके साथ कुछ करने के लिए कुछ हो सकता है। –

+1

'os.path.getmtime()' कुछ भी कैश नहीं करता है। यह बस 'os.stat (फ़ाइल नाम) .st_mtime' देता है। 'os.stat()' कुछ भी कैश नहीं करता है, यह बस सी लाइब्रेरी में कॉल करता है, जो उस जानकारी के लिए ओएस से पूछता है। –

उत्तर

0

शायद आप फ़ाइल पर सामान्य आंकड़े जैसे आकार के अलावा सामान्य आंकड़े प्राप्त करने का प्रयास कर सकते हैं।

सर्वर पर परिवर्तन के पहले और बाद में फ़ाइल का अनुमानित आकार/एमटाइम है (यानी टर्मिनल विंडो में ls -l देखते समय) एक ही या अलग है।

यदि ऐसे कमांड लाइन उपकरण का उपयोग करते समय आंकड़े समान होते हैं तो हो सकता है कि फ़ाइल को संपादित नहीं किया जा रहा हो, जहां आप सोचते हैं।

तो आकार/mtime अलग है शायद का उपयोग

os.stat(filename) 

और देखें कि क्या वह सही मान के किसी भी देता है।

1

मैं एक टिप्पणी के रूप में जोड़ना पर्याप्त प्रतिष्ठा नहीं है ...

यह स्पष्ट है आप कैसे परीक्षण कर रहे हैं नहीं है, अपने वेब एप्लिकेशन

  • प्रिंट mtime
  • में से एक ही पृष्ठ करता है
  • अपडेट फाइल
  • प्रिंट mtime

या

  • बस प्रिंट mtime

यदि आपका वेब एप्लिकेशन जांच प्रक्रिया

  • अनुरोध परीक्षण mtime पेज
  • मैन्युअल फ़ाइल को अपडेट
  • अनुरोध परीक्षण mtime पेज
  • टिप्पणी है वह mtime दोनों पृष्ठ दृश्यों पर समान है

मेरा पहला अनुमान वेब क्लाइंट, प्रॉक्सी, या सर्वर कैशिंग है।

1

मुझे आज इसका सामना करना पड़ा और यह सवाल मिला, इसलिए मैंने सोचा कि मैं इसे यहां दस्तावेज करूंगा।मेरा मामला एक यूनिट टेस्ट था, इसलिए यह थोड़ा अलग हो सकता है क्योंकि यह मैन्युअल परीक्षण की तुलना में छोटे समय के पैमाने से संबंधित है।

संशोधन समय आपके फ़ाइल सिस्टम द्वारा सीमित है। यदि आप संशोधन समय की जांच करते हैं, तो डेटा की एक छोटी राशि लिखें, फिर संशोधन समय फिर से जांचें, दो टाइमस्टैम्प बिल्कुल बराबर हो सकते हैं। वे बराबर होंगे यदि पहली बार स्टाम्प चेक के बीच का समय और लिखने का अंत समय संकल्प से कम है।

विभिन्न सामान्य फाइल सिस्टम के समय संकल्प पर कुछ आँकड़े:

  • FAT32: 2s
  • ext3: 1s
  • exFAT: 10ms
  • NTFS: 100ns
  • ext4: 1ns

आप एम्बेडेड सिस्टम को एफएटी का उपयोग करने की उम्मीद कर सकते हैं, और एक टीआई है मुझे 2 सेकंड का संकल्प। पुराने विंडोज सिस्टम 2 सेकंड की रेंज में होंगे। नए विंडोज सिस्टम में 100ns या 10ms होगा। पुराने यूनिक्स-सिस्टम में अक्सर 1 एस होगा। नए यूनिक्स-सिस्टम में 1ns का संकल्प होगा।

यदि <time for time stamp check> + <time for file write> समय संकल्प से कम है, तो फ़ाइल प्रकट हो सकती है जैसे कि संशोधित नहीं किया गया है।

मैं इन संभव समाधान देखें:

  • फ़ाइल आप लिख रहे हैं के शीर्षक में एक और अधिक सटीक संशोधन समय शामिल करें। फ़ाइल लेखक यह भी जांच सकता है कि फ़ाइल पहले से मौजूद है और नैनोसेकंद संशोधन समय को कम से कम 1 तक बढ़ाकर यह गारंटी देने के लिए कि यह अपडेट (टाइम स्टैम्प सटीकता की लागत पर) है।
  • कहीं और स्टोर करें कि प्रत्येक फ़ाइल कितनी बार संपादित की गई थी। यह जांचने के लिए इस नंबर का उपयोग करें कि क्या आपने पिछली बार जांच के बाद संपादित किया था या नहीं। ध्यान दें कि फ़ाइल को परमाणु रूप से लिखना संभव नहीं है और संशोधन गणना को एक साथ अपडेट करना संभव नहीं है।
  • शायद कुछ चालबाजी नींद के साथ तैयार की जा सकती है, जैसे कि पहली बार स्टाम्प चेक और फ़ाइल लेखन के बीच का समय कम से कम न्यूनतम समय संकल्प होता है। यह आपके सेट-अप पर भारी निर्भर करेगा, और यह थ्रेड को अवरुद्ध कर देगा।
संबंधित मुद्दे