आप इंटरैक्टिव पाइथन में पूरे कमांड इतिहास को कैसे देखते हैं?


149

मैं मैक ओएस एक्स पर डिफ़ॉल्ट अजगर व्याख्याता का काम कर रही हैं और मुझे Cmd+ K(मंजूरी दे दी) मेरी पहले आदेशों। मैं तीर कुंजी का उपयोग करके एक-एक करके उनके माध्यम से जा सकता हूं। लेकिन क्या बैश शेल में --history विकल्प जैसा कोई विकल्प है, जो आपको अब तक दर्ज किए गए सभी आदेश दिखाता है?


historyशेल कमांड किसी अन्य की तरह एक कार्यक्रम है। यह bashकमांड में "विकल्प" नहीं है ।
निलोक्ट

6
सटीक होना: historyएक शेल बिलिन है।
ब्ल्यूरी

3
के लिए IPython जवाब है %history। और -gविकल्प को पहले सत्र मिलते हैं ।
स्टेन पर बॉब स्टीन

% इतिहास -g +% संपादन सबसे अच्छा काम करता है
डायनो फू

जवाबों:



250

संपूर्ण इतिहास को मुद्रित करने के लिए कोड:

अजगर ३

वन-लाइनर (त्वरित प्रतिलिपि और पेस्ट):

import readline; print('\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())]))

(या अब का संस्करण ...)

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

अजगर २

वन-लाइनर (त्वरित प्रतिलिपि और पेस्ट):

import readline; print '\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())])

(या अब का संस्करण ...)

import readline
for i in range(readline.get_current_history_length()):
    print readline.get_history_item(i + 1)

नोट : get_history_item()1 से n तक अनुक्रमित है।


31
एक लाइनर:import readline; print '\n'.join([str(readline.get_history_item(i)) for i in range(readline.get_current_history_length())])
मैट

24
यह उत्तर (और इसके गैर-उदाहरण समकक्ष) लोगों के लिए महत्वपूर्ण उदाहरण हैं। धन्यवाद।
टिम एस।

8
ठंडा! मैंने history()अपने पायथन इंटरप्रेटर स्टार्टअप स्क्रिप्ट (env। Var द्वारा इंगित की गई स्क्रिप्ट) में उपरोक्त के साथ एक फ़ंक्शन जोड़ा है $PYTHONSTARTUP। अब से, मैं बस history()किसी भी दुभाषिया सत्र में टाइप कर सकता हूं ;-)
sxc731

2
हर बार मैं भूल जाता हूं कि यह कैसे किया जाता है, मैं यहां जवाब के लिए आता हूं, धन्यवाद डेनिस।
फेलिप वैलेड्स

3
मैंने इसे अभिनीत किया जो जानता है कि मैं कब और कैसे इस अच्छाई को एक बार फिर से रोशन करूंगा। 👍🏽
बर्टो

45

अजगर 3 व्याख्याकार के साथ इतिहास को लिखा है
~/.python_history


मेरे पास यह निर्देशिका नहीं है और मैं Python 3.5.2

यह यूनिक्स जैसे OSes के लिए होगा। मैं के साथ MacOS पर अपने इतिहास को पुन: प्राप्त करने में सक्षम थाcat ~/.python_history
रयान एच

1
इस उत्तर के लिए धन्यवाद। बाद में मैंने इसे यहां के डॉक्स में शामिल पाया: docs.python.org/3/library/site.html#readline-configuration
Jason V.

4
दुर्भाग्यवश, आभासी वातावरण का उपयोग करते समय इतिहास अपडेट नहीं होता है: - /
क्रिसफ्रेमेन

4
आपको quit()वर्तमान सत्र के इतिहास के लिए दुभाषिया की आवश्यकता है~/.python_history
plexoos

9

यदि आप फ़ाइल में इतिहास लिखना चाहते हैं:

import readline
readline.write_history_file('python_history.txt')

सहायता समारोह देता है:

Help on built-in function write_history_file in module readline:

write_history_file(...)
    write_history_file([filename]) -> None
    Save a readline history file.
    The default filename is ~/.history.

क्या यह रूबी के शिकार इतिहास जैसे अजगर सत्रों में बनी रहेगी?
लैकोस्टेनकोडर

हो सकता है कि यह उत्तर रीडलाइन फ़ंक्शन से पहले लिखा गया था, लेकिन रीडलाइन का उपयोग क्यों नहीं किया गया। राइट_हिस्ट्री_फाइल? @lacostenycoder आप एक इतिहास फ़ाइल को पढ़ने और लिखने दोनों के लिए रीडलाइन का उपयोग कर सकते हैं जो बनी रहती है।
जो होलोवे

@JoeHolloway कूल, धन्यवाद! मैंने जवाब बदल दिया है!
मार्टिन थोमा

4

चूँकि ऊपर केवल अजगर 3.x के लिए काम करता है 3.x (विशेष रूप से 3.5) समान है, लेकिन मामूली मोड के साथ:

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

अतिरिक्त ध्यान दें ()

(शेल स्क्रिप्ट्स का उपयोग पार्से .python_history का उपयोग करना या उपरोक्त कोड को संशोधित करने के लिए अजगर का उपयोग करना व्यक्तिगत स्वाद और स्थिति imho का मामला है)


3
Win10 C:\>python -m pip install readline=> Collecting readline\ n Downloading https://files.pythonhosted.org/packages/f4/01/2cf081af8d880b44939a5f1b446551a7f8d59eae414277fd0c303757ff1b/readline-6.2.4.1.tar.gz (2.3MB)\ n |████████████████████████████████| 2.3MB 1.7MB/s\ n ERROR: Complete output from command python setup.py egg_info:\ n ERROR: error: this module is not meant to work on Windows\ n ----------------------------------------\ n `त्रुटि: कमांड" python setup.py अंडा_info "C में त्रुटि कोड 1 के साथ विफल हुआ: \ Users \ dblack \ AppData \ Local \ Tem \ \ install-s6m4zkdw \ readline`
bballdave025

1
@ bballdave025 हां, आप नहीं कर सकते pip install readline, लेकिन readlineविंडोज पर डिफ़ॉल्ट रूप से स्थापित है।
योशिय्याह योद

खैर, इससे चीजें आसान हो जाती हैं। धन्यवाद @ जोशैयायोडर
bballdave025

@ bballdave025 मैंने सीखा है कि यह डिफ़ॉल्ट रूप से विंडोज़ पर स्थापित नहीं है, लेकिन यदि आप लिंक का अनुसरण करते हैं, तो निर्देश विवरण देते हैं - कुछ ऐसा जैसे कि पायरेडलाइन या कुछ और स्थापित करना।
जोशिया योदर

4

IPython में %history -gआपको पूरी कमांड हिस्ट्री देनी चाहिए। डिफ़ॉल्ट कॉन्फ़िगरेशन आपके उपयोगकर्ता निर्देशिका में .python_history नामक फ़ाइल में आपके इतिहास को भी सहेजता है।


3

इतिहास को यूनिक्स / बैश संस्करण के समान पाने के लिए एक सरल कार्य।

आशा है कि यह कुछ नए लोगों की मदद करता है।

def ipyhistory(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        flen = len(str(hlen)) if not lastn else len(str(lastn))
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(": ".join([str(r if not lastn else r + lastn - hlen ).rjust(flen), readline.get_history_item(r)]))
    else:
        flen = len(str(-hlen))
        for r in range(1, -lastn + 1):
            print(": ".join([str(r).rjust(flen), readline.get_history_item(r)]))

स्निपेट: पायथन 3 के साथ परीक्षण किया गया। मुझे पता है कि python2 के साथ कोई गड़बड़ है। नमूने:

पूरा इतिहास: ipyhistory()

अंतिम 10 इतिहास: ipyhistory(10)

पहला 10 इतिहास: ipyhistory(-10)

आशा है कि यह फेलस को मदद करता है।


धन्यवाद। मैंने आपका कोड स्निपेट xx.py फ़ाइल में बनाया है। फिर अजगर खोलने के बाद, मैंने xx आयात किया। जब मैंने ipyhistory () की कोशिश की, लेकिन यह कहता है, ">>> ipyhistory Traceback (सबसे हालिया कॉल अंतिम): फ़ाइल" <stdin> ", पंक्ति 1, में <मॉड्यूल> NameError: नाम 'ipyhistory। परिभाषित नहीं है"। क्या गलत है?
किम

मैंने इसे संशोधित किया है कि लाइन नंबर न प्रिंट करें क्योंकि वे आमतौर पर मेरे लिए रास्ते में आते हैं, लेकिन मुझे लाइन-लिमिटिंग की क्षमता पसंद थी। (यहां तक ​​कि यूनिक्स पर, मैं आमतौर पर cut -c 8उन्हें बाहर निकालता हूं ।)
जोशिया योडर

1

@ जेसन-वी, यह वास्तव में मदद करता है, धन्यवाद। फिर, मैंने यह उदाहरण पाया और स्वयं स्निपेट की रचना की।

#!/usr/bin/env python3
import os, readline, atexit
python_history = os.path.join(os.environ['HOME'], '.python_history')
try:
  readline.read_history_file(python_history)
  readline.parse_and_bind("tab: complete")
  readline.set_history_length(5000)
  atexit.register(readline.write_history_file, python_history)
except IOError:
  pass
del os, python_history, readline, atexit 

1

यह आपको अलग-अलग लाइनों में मुद्रित कमांड देनी चाहिए:

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)

क्या आप कृपया कोड प्रारूपण पर अधिक विशिष्ट हो सकते हैं? क्या आप कह रहे हैं कि कोष्ठक मेल नहीं खा रहे हैं?
Idea4life

मैंने कुछ सरल इंडेंटेशन के साथ प्रारूपण तय किया है। @AleksAndreev आप अपने डाउनवोट को हटा सकते हैं।
क्रिसफ्रीमैन

0

के मिश्रित Doogle के जवाब यह है कि printline संख्या नहीं करता है, लेकिन लाइनों मुद्रित करने के लिए की संख्या का उल्लेख करने की अनुमति नहीं है।

def history(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(readline.get_history_item(r))
    else:
        for r in range(1, -lastn + 1):
            print(readline.get_history_item(r))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.