मैं पायथन 3.4 में नया इतिहास फीचर कैसे अक्षम कर सकता हूं?


10

पायथन 3.4 में अपग्रेड करने के बाद से, सभी इंटरैक्टिव कमांड लॉग इन हैं ~/.python_history। मैं अजगर को इस फाइल को बनाने या लिखने के लिए नहीं चाहता।

/dev/nullकाम नहीं करने के लिए एक सिमलिंक बनाना , पायथन फाइल को हटा देता है और इसे फिर से बनाता है। प्रलेखन नष्ट करने के लिए सुझाव देते हैं sys.__interactivehook__, लेकिन यह भी टैब-पूरा होने को हटा। इस इतिहास फ़ाइल को लिखने में अक्षम करने के लिए क्या किया जाना चाहिए लेकिन फिर भी टैब पूरा करने को संरक्षित करना चाहिए?

अतिरिक्त जानकारिया:


क्या आपने इसे जड़ने की कोशिश की है?
गोल्डीलॉक्स

@goldilocks मैं नहीं मानता कि एक स्वीकार्य समाधान, और न ही उपयोग कर रहा है chattr। मैं एक एकल (उपयोगकर्ता) कॉन्फ़िगरेशन फ़ाइल या पर्यावरण चर की तलाश कर रहा हूं।
लीकेनस्टाइन

ठीक है, लेकिन आप पहले से ही जानते हैं कि इस तरह का कोई स्वीकार्य समाधान नहीं है क्योंकि आपने प्रलेखन को देखा है।
गोल्डीलॉक्स

वास्तव में, कुछ हफ्तों पहले से इस बग रिपोर्टchmod में अजगर देवों द्वारा सुझाया गया समाधान है , हालांकि वहाँ भी कुछ उल्लेख है ( लाइब्रेरी फ़ंक्शन को छोड़कर, बीटीडब्ल्यू नहीं है)। ~/.inputrcman readline
गोल्डिलॉक्स

@goldilocks हाँ, मैं उस बग रिपोर्ट से लिंक करने वाला था। मैं नहीं जानता कि कैसे उपयोग करना inputrcहै और chmodमेरे लिए काम नहीं करता है, फ़ाइल वैसे भी संशोधित हो जाती है (आर्क लिनक्स)। एक info inputrcपृष्ठ मौजूद है , लेकिन मैं आम तौर पर जानकारी पृष्ठों को पढ़ने से उतना खुश नहीं हूं, क्योंकि वे नेविगेट करने में मुश्किल हैं।
लेकेनस्टाइन

जवाबों:


7

अजगर 3.6 के रूप में, आप इसे निष्क्रिय करने के लिए readline.set_auto_history का उपयोग कर सकते हैं :

import readline
readline.set_auto_history(False)

यह पायथन शेल के लिए अच्छा है, लेकिन खबरदार: यह ipython में काम नहीं करता है।
z0r

यह पूरी तरह से इतिहास को निष्क्रिय कर देता है। व्यक्तिगत रूप से मैं अपने व्याख्याकार सत्र में संरक्षित किए जा रहे इतिहास के साथ ठीक हूं, लेकिन मैं नहीं चाहता कि मेरा इतिहास डिस्क पर लिखे और सत्रों में संरक्षित हो।
jamesdlin

काम नहीं करता है। यह फ़ाइल को सहेजे जाने से नहीं रोकता है, और इसके बजाय यह सत्र के दौरान इतिहास को तोड़ता है। किसी भी स्थिति में, पायथन अगली बार जब आप इसे चलाते हैं, तो "सुविधा" को वापस चालू कर देता है।
Boann

5

यह मेरे लिए काम करता है।

~/.pythonrcफ़ाइल बनाना :

import os
import atexit
import readline

readline_history_file = os.path.join(os.path.expanduser('~'), '.python_history')
try:
    readline.read_history_file(readline_history_file)
except IOError:
    pass

readline.set_history_length(0)
atexit.register(readline.write_history_file, readline_history_file)

फिर इसे निर्यात करें:

export PYTHONSTARTUP=~/.pythonrc

ऐसा लगता है कि यदि मैं गलत नहीं हूँ तो इसे अक्षम करने के बजाय एक इतिहास फ़ाइल लिखने में सक्षम होना चाहिए ? जब तक कुछ जादुई नहीं होता? टैब-पूरा करना कार्यों के लिए किया जाता है, न कि इतिहास के लिए। set_history_length
लेकेनस्टाइन

@Lekensteyn: हाँ, यह इतिहास के आकार को शून्य बनाता है इसलिए इतिहास फ़ाइल में कुछ भी नहीं लिखा जाता है। ओह, हालांकि मैं आपको सत्रों के बीच कमांड को संरक्षित करना चाहता हूं।
16ong में

2
यह अभी भी ~/.python_historyलिखा जा सकता है (साथ सत्यापित PYTHONSTARTUP=$HOME/.pythonrc strace -e file,write -o /tmp/st python)। मुझे लगता है कि इसे अक्षम करने का कोई तरीका नहीं है, लेकिन कोड को डुप्लिकेट किए बिना टैब पूरा करना है /usr/lib/python3.4/site.py
लेकेनस्टाइन

AFAIK, वास्तव में इसे अक्षम करने का कोई तरीका नहीं है।
cuonglm

3

एक और ~ / .pythonrc समाधान:

import readline
readline.write_history_file = lambda *args: None

मुझे नहीं पता कि यह अधिक क्यों नहीं उतारा जाता है। यह सरल है और सीधे इतिहास को पूरी तरह से अक्षम करने के बजाय इतिहास फ़ाइल लिखने का दमन करता है।
jamesdlin

यह एकमात्र फिक्स था जिसने मेरे लिए काम किया। धन्यवाद।
बोएन

1

अजगर को लिखने से रोकने के लिए ~/.python_history, इस कार्यक्षमता को सक्रिय करने वाले हुक को अक्षम करें :

import sys
# Disable history (...but also auto-completion :/ )
if hasattr(sys, '__interactivehook__'):
    del sys.__interactivehook__

यदि आप टैब-पूर्णता को सक्षम करना चाहते हैं और इतिहास सुविधा को अक्षम करना चाहते हैं, तो आप site.enablerlcompleterकोड को अनुकूलित कर सकते हैं । निम्न कोड लिखें ~/.pythonrcऔर export PYTHONSTARTUP=~/.pythonrcइसे सक्षम करने के लिए अपने शेल में सेट करें।

import sys
def register_readline_completion():
    # rlcompleter must be loaded for Python-specific completion
    try: import readline, rlcompleter
    except ImportError: return
    # Enable tab-completion
    readline_doc = getattr(readline, '__doc__', '')
    if readline_doc is not None and 'libedit' in readline_doc:
        readline.parse_and_bind('bind ^I rl_complete')
    else:
        readline.parse_and_bind('tab: complete')
sys.__interactivehook__ = register_readline_completion

0

जब तक यह किसी तरह से पाइथन में तय नहीं हो जाता, तब तक आप इसे UNIX सिस्टम पर कर सकते हैं:

rm ~/.python-history
mkdir ~/.python-history
sudo chattr +i ~/.python-history || sudo chflags simmutable ~/.python-history

उसके बाद आपको मिल जाएगा

Atexit._run_exitfuncs में त्रुटि:

IsADirectoryError: [Errno 21] एक निर्देशिका है

हर बार जब आप एक अजगर खोल को समाप्त करते हैं। बाहर निकलने की स्थिति अभी भी रहेगी 0

ध्यान दें कि यदि आप इसे फ़ाइल के रूप में छोड़ते हैं, तो आपको दूसरी फ़ाइल बनाने और बनाने की आवश्यकता होती है, ~/.python_history


0

निम्नलिखित को एक फ़ाइल में रखें और PYTHONSTARTUPइसे सेट करें (या फ़ाइल को कॉल करें sitecustomize.pyऔर इसे से एक्सेस करें PYTHONPATH)

import readline
import atexit
import sys

sys.__interactivehook__()
atexit.unregister(readline.write_history_file)

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


यह काम नहीं करता है (आर्क लिनक्स पर पायथन 3.5.1), इतिहास फ़ाइल अभी भी बाहर निकलने पर लिखी गई है, यहां तक ​​कि PYTHONSTARTUPस्क्रिप्ट के माध्यम से वास्तव में बंद कर दिया गया है।
लेकेन्स्टाइन

मैंने अभी-अभी अपने आर्क लिनक्स vm पर इसका परीक्षण किया है, और यह ठीक काम करता है: gist.github.com/berdario/640b3ab00b128fdf3338
berdario

0

यहाँ मेरी विधि है (जो मूल रूप से बेर्डारियो की विधि का अधिक विश्वसनीय और पायथोनिक संस्करण है)। यह केवल लेखन को अक्षम करता है .python_history, लेकिन इसे पढ़ने से नहीं अगर यह मौजूद है, या वर्तमान उदाहरण के इतिहास में नई लाइनें जोड़ रहा है। मैं इसे सहेजने की सलाह देता हूं site-packages/sitecustomize.py, क्योंकि siteमॉड्यूल वह है जो दोनों लिखता है .python_historyऔर sitecustomizeअगर मौजूद है तो आयात करता है , हालांकि इसे कुछ और नाम दिया गया है और PYTHONSTARTUPकामों के साथ भी इसे इंगित करता है।

import sys
oldhook = getattr(sys, '__interactivehook__', None)
if oldhook:
    def newhook():
        import readline, atexit
        oldhook()
        atexit.unregister(readline.write_history_file)
    sys.__interactivehook__ = newhook

अद्यतन: मैंने 3.7 के लिए क्या किया, मेरे सिस्टम के लिए विशिष्ट, pep8 नहीं:

import rlcompleter,readline as r,sys
def f():r.parse_and_bind('tab:complete');r.read_init_file()
sys.__interactivehook__=f

पायथन 3.7.3। काम नहीं कर रहा। इतिहास अभी भी लॉग इन है।
Boann

0

मेरा वर्तमान समाधान (पायथन 3 के हाल के पर्याप्त संस्करणों के लिए) ~ / .python_history के डिफ़ॉल्ट उपयोग को रोकता है, लेकिन किसी दिए गए फ़ाइल में इतिहास के स्पष्ट लेखन की संभावना छोड़ देता है (readline.write_history_file (फ़ाइल नाम) या readline.append_history_file (...) )) को किसी की PYTHONSTARTUP फ़ाइल में निम्नलिखित होना चाहिए:

import readline
import time

readline.add_history("# " + time.asctime()) # prevent default use of ~/.python_history
readline.set_history_length(-1) # unlimited

यह दुभाषिया के स्टार्टअप समय के साथ किसी भी स्पष्ट रूप से लिखित इतिहास को लेबल करने के सुखद (मेरे लिए) पक्ष प्रभाव है। यह बग 5845 के फिक्स के कारण काम करता है जिसे यहां देखा जा सकता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.