2015-07-29 7 views
21

मेरी मूर्खता के कारण, कई सत्रों में विम के साथ कई अलग-अलग स्क्रीन सत्रों का प्रबंधन करते समय, मेरे सत्रों को "व्यवस्थित करने" की कोशिश करने की प्रक्रिया में मैंने किसी भी तरह से 0 बिट फ़ाइल के साथ एक बहुत ही महत्वपूर्ण .py स्क्रिप्ट को ओवरराइट करने में कामयाब रहे।महत्वपूर्ण खो गया .py फ़ाइल (0byte फ़ाइल के रूप में अधिलेखित), लेकिन पुराना संस्करण अभी भी आईपॉथॉन में मॉड्यूल के रूप में लोड किया गया - क्या इसे पुनर्प्राप्त किया जा सकता है?

फिर भी, मेरे पास एक आईपीथॉन इंस्टेंस खुला है कि, उसी मॉड्यूल के रूप में उसी .py फ़ाइल को चलाने पर, अभी भी उस कोड को याद किया जाता है जो वहां होता था!

तो क्या मैंने बैकअप के बारे में एक कठिन सबक सीख लिया था (मेरा आखिरी वाला एक सप्ताह पहले विम द्वारा किया गया था, जो मुझे बहुत काम करने के लिए छोड़ देगा), या पर कोई संभावित, कल्पना करने योग्य तरीका है पहले से लोड मॉड्यूल से .py फ़ाइल पुनर्प्राप्त करें? शायद मैं इस तरह के कैवेलियर होने के लायक हूं, लेकिन मैं यहां गंभीर रूप से हताश हूं।

+1

जो आपने कंसोल में टाइप किया है उसे पुनर्प्राप्त करने के लिए: 'आयात रीडलाइन; प्रिंट करें \ n'.join ([str (readline.get_history_item (i)) मैं रेंज में (readline.get_current_history_length())]) लेकिन यह शायद आपकी समस्या का समाधान नहीं करता – jojo

+0

मुझे नहीं लगता कि वास्तव में यह वास्तव में क्या है वह खोज रहा है वह लोड किए गए मॉड्यूल के नाम को जानता है, वह वर्तमान में लोड किए गए मॉड्यूल की सामग्री को पुनर्प्राप्त करने के लिए देख रहा है। – Slater

+0

यदि आपके पास अभी भी एक पीईसी फाइल है जो अभी भी लटक रही है, [इसे आजमाएं] (http://stackoverflow.com/questions/5287253/is-it-possible-to-decompile-a-compiled-pyc-file-into-a- py-फाइल)? (मुझे लगता है कि आईपीथॉन पीईसी फाइलें उत्पन्न करता है, लेकिन यकीन नहीं) – NightShadeQueen

उत्तर

22

के रूप में टिप्पणी में बताया गया है, inspect.getsource होगा काम नहीं करते क्योंकि यह मूल फ़ाइल पर निर्भर करता है (यानी, module.__file__)।

सर्वश्रेष्ठ विकल्प: यह देखने के लिए जांचें कि .pyc फ़ाइल है (उदा। foo.pycfoo.py के बगल में होना चाहिए)। यदि ऐसा है, तो आप इसे हटाने के लिए Decompile Python 2.7 .pyc का उपयोग कर सकते हैं।

inspect मॉड्यूल भी स्रोत को कैश करता है। आप भाग्यशाली हो सकते हैं और inspect.getsource(module), या inspect.getsourcelines(module.function) का उपयोग कर सकते हैं यदि इसे अतीत में बुलाया गया हो।

अन्यथा आपको निर्यात का निरीक्षण करके "मैन्युअल रूप से" मॉड्यूल का पुनर्निर्माण करना होगा (यानी module.__globals__)। कॉन्स्टेंट्स और व्हाट्नॉट स्पष्ट नहीं हैं, और कार्यों के लिए आप func.func_name का उपयोग कर सकते हैं, func.__doc__ तर्क प्राप्त करने के लिए डॉकस्ट्रिंग, inspect.getargspec(func) प्राप्त करने के लिए, और func.func_code कोड के बारे में विवरण प्राप्त करने के लिए: co_firstlineno लाइन नंबर प्राप्त होगा, फिर co_code मिलेगा कोड। वहाँ है कि यहाँ decompiling के बारे में अधिक है: Exploring and decompiling python bytecode

उदाहरण के लिए, uncompyle2 उपयोग करने के लिए:

>>> def foo(): 
...  print "Hello, world!" 
... 
>>> from StringIO import StringIO 
>>> import uncompyle2 
>>> out = StringIO() 
>>> uncompyle2.uncompyle("2.7", foo.func_code, out=out) 
>>> print out.getvalue() 
print 'Hello, world!' 

लेकिन, कोई - मैं किसी भी अधिक सीधे आगे विधि के बारे में पता नहीं कर रहा हूँ एक मॉड्यूल लेने के लिए और स्रोत कोड प्राप्त करने के बच निकलना।

>>> help(test) 

Help on module test: 

NAME 
    test 

FILE 
    /Users/tfisher/code/ffi4wd/test.py 

FUNCTIONS 
    call_cat(cat) 

DATA 
    cat_name = 'commander sprinkles' 

कौन सा क्लीनर है: क्या हम test के लिए दुकान में है पर

>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'readline', 'rlcompleter', 'test'] 

आइए नज़र:

+8

आपने पिछले 2 चरणों को छोड़ दिया: स्रोत नियंत्रण का उपयोग शुरू करें और इस गलती को फिर कभी भी संवेदनशील न हो! –

+10

पीएफटी, लेकिन अगर लोग चले गए और मूर्खतापूर्ण चीजें करते हैं तो मुझे इन सभी मीठा मीठे इंटरनेट अंक कैसे प्राप्त होंगे? –

+0

स्पष्ट होने के लिए, क्या आपका लिंक केवल .comc फ़ाइलों को डीकंपलिंग के लिए नहीं है? या uncompyle2 मॉड्यूल.function.func_code.co_code, या शायद dis.dis (module.function) को समझने में सक्षम है? –

0

आप अपने IPython सत्र में inspect

आयात inspect उपयोग करने में सक्षम होना चाहिए, और यह मानकर कि आप myModule ठीक करने के लिए कोशिश कर रहे हैं, कार्य करें:

q = inspect.getsource(myModule)

और एक फाइल करने के लिए q लिखें।

[संपादित करें] यह मेरे लिए काम किया अजगर 2.7.6 का उपयोग कर समस्या का अनुकरण, IPython 1.2.1

[# संपादित 2]

enter image description here

+0

फ़ाइल को हटा दिया गया है (बस परीक्षण किया गया है) यह काम नहीं करता है। – Ffisegydd

+0

यह काम नहीं करेगा। 'inspect.getsource' 'मॉड्यूल .__ file__' से पढ़ता है, जिसे शून्य किया जाएगा। –

+0

@Ffisegydd मेरे लिए काम करता है (बस परीक्षण किया गया) – Ryan

0
प्रक्रिया अब भी चल साथ

, आप पुनर्स्थापित करना उम्मीदवारों खोजने के लिए अपने नाम स्थान को देख सकते हैं test के अंदर स्थानीय लोगों को देखने से आउटपुट:

>>> dir(test) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'call_cat', 'cat_name', 'json'] 

inspect module का उपयोग करना, हम कार्यों के लिए तर्क विनिर्देशों प्राप्त कर सकते हैं:

>>> inspect.getargspec(test.call_cat) 
ArgSpec(args=['cat'], varargs=None, keywords=None, defaults=None) 

या हमारे कार्यों के अंदर लाइनों:

>>> inspect.getsourcelines(test.call_cat) 
(['def call_cat(cat):\n', ' print("Hello %s" % cat)\n'], 5) 

कौन सा यथोचित मूल के करीब है:

import json 

cat_name = 'commander sprinkles' 

def call_cat(cat): 
    print("Hello %s" % cat) 

अगर आयात किए जाने के बाद फ़ाइल हटा दी जाती है तो उसे काम करना चाहिए और उसी नाम की फ़ाइल द्वारा प्रतिस्थापित नहीं किया गया है जो नया है (getsourcelines उपयोग यदि संभव हो तो ऑब्जेक्ट कैश):

$ python -V 
Python 2.7.10 

$ ls | grep test 
$ 
+0

'inspect.getsourcelines' काम नहीं करेगा; रयान के जवाब पर टिप्पणियां देखें। –

+0

@ डेविडवॉल्वर क्या आप निश्चित हैं? 'गेटोरसेलिन' फाइल को लापता होने के साथ मेरी मशीन पर काम कर रही है। इसकी तंत्र 'होसोर्स' की तुलना में अलग-अलग काम कर सकती है। –

+0

जोरदार रूप से: http://hul.wolever.net/skitch/inspect-get-source-lines-20150729-141243.png –

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