Python 3.4'teki yeni geçmiş özelliğini nasıl devre dışı bırakabilirim?


10

Python 3.4'e yükseltme yaptığından, tüm etkileşimli komutlar oturum açılır ~/.python_history. Python'un bu dosyayı oluşturmasını veya bu dosyaya yazmasını istemiyorum.

Bir symlink oluşturmak /dev/nullişe yaramaz, Python dosyayı kaldırır ve yeniden oluşturur. Dokümantasyon silmek önerir sys.__interactivehook__, ancak bu da sekme tamamlama kaldırır. Bu geçmiş dosyasının yazılmasını devre dışı bırakmak, ancak sekmenin tamamlanmasını korumak için ne yapılmalı?

Ek detaylar:


Köklendirmeyi denedin mi?
goldilocks

@goldilocks Kabul edilebilir bir çözüm olduğunu düşünmüyorum ve hiçbiri kullanmıyor chattr. Tek bir (kullanıcı) yapılandırma dosyası veya ortam değişkeni arıyorum.
Lekensteyn

Tamam, ancak belgelere baktığınız için böyle kabul edilebilir bir çözüm olmadığını zaten biliyorsunuz.
goldilocks

Aslında, bu hata raporundachmod python devs tarafından önerilen çözüm , orada da bir miktar söz olmasına rağmen ( kütüphane işlevi hariç BTW yok ). ~/.inputrcman readline
goldilocks

@goldilocks Evet, bu hata raporuna bağlanmak üzereydim. inputrcYine de nasıl kullanılacağını bilmiyorum ve chmodbenim için de çalışmıyor, dosya yine de değiştirildi (Arch Linux). Bir info inputrcsayfa var, ancak genellikle gezinmek zor olduğu için bilgi sayfalarını okumaktan pek memnun değilim.
Lekensteyn

Yanıtlar:


7

Python 3.6'dan itibaren bunu devre dışı bırakmak için readline.set_auto_history'yi kullanabilirsiniz :

import readline
readline.set_auto_history(False)

Bu Python kabuğu için iyi, ama dikkat: ipython'da çalışmıyor gibi görünüyor.
z0r

Bu, tarihi tamamen devre dışı bırakır. Şahsen, tercüman oturumumda tarihin korunmasında iyiyim, ancak tarihimin diske yazılmasını ve oturumlar boyunca korunmasını istemiyorum.
jamesdlin

Çalışmıyor. Bu, dosyanın kaydedilmesini durdurmaz ve bunun yerine oturum sırasında geçmişi keser. Her durumda, Python sessizce "özelliği" tekrar çalıştırdığınızda açar.
Boann

5

Bu benim için çalışıyor.

Oluşturma ~/.pythonrcdosyası:

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)

Ardından dışa aktarın:

export PYTHONSTARTUP=~/.pythonrc

Bu , yanılmıyorsam devre dışı bırakmak yerine bir geçmiş dosyası yazmayı etkinleştiriyor gibi görünüyor ? Büyülü bir şey olmadığı sürece ? Sekme tamamlama, tarih için değil işlevler için yapılır. set_history_length
Lekensteyn

@Lekensteyn: evet, tarih boyutunu sıfıra eşit yapar, böylece geçmiş dosyasına hiçbir şey yazılmaz. Oh, ama seanslar arasındaki komutu korumak istiyorsun.
cuonglm

2
Bu hala ~/.python_historyyazılmaya neden olur (ile doğrulanır PYTHONSTARTUP=$HOME/.pythonrc strace -e file,write -o /tmp/st python). Bunu devre dışı bırakmanın bir yolu olmadığını düşünmeye başladım, ancak kodu çoğaltmadan sekme tamamlamayı koruyun /usr/lib/python3.4/site.py.
Lekensteyn

AFAIK, gerçekten devre dışı bırakmanın bir yolu yok.
cuonglm

3

Başka bir ~ / .pythonrc çözümü:

import readline
readline.write_history_file = lambda *args: None

Bunun neden daha fazla değerlendirilmediğini bilmiyorum. Bu basittir ve geçmişi tamamen devre dışı bırakmak yerine geçmiş dosyasının yazılmasını doğrudan bastırır .
jamesdlin

Benim için çalışan tek düzeltme buydu. Teşekkürler.
Boann

1

Python'un yazmasını önlemek için ~/.python_history, bu işlevi etkinleştiren kancayı devre dışı bırakın :

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

Sekme tamamlamayı etkinleştirmek ve geçmiş özelliğini devre dışı bırakmak istiyorsanız, site.enablerlcompleterkodu uyarlayabilirsiniz . Aşağıdaki kodu yazın ~/.pythonrcve export PYTHONSTARTUP=~/.pythonrcetkinleştirmek için kabuğunuzda ayarlayın .

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

Python'da bir şekilde düzeltilinceye kadar bunu UNIX sistemlerinde yapabilirsiniz:

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

Ondan sonra

Atexit._run_exitfuncs hatası:

IsADirectoryError: [Errno 21] Bir dizindir

her python kabuğunu sonlandırdığınızda. Çıkış durumu hala geçerli olacaktır 0.

Dosya olarak bırakırsanız, başka bir dosya oluşturmanız ve değiştirilmeniz gerektiğine dikkat edin, ~/.python_history


0

Aşağıdakileri bir dosyaya koyun ve dosyaya ayarlayın PYTHONSTARTUP(veya dosyayı arayın ve dosyadan sitecustomize.pyerişilebilir olmasını sağlayın PYTHONPATH)

import readline
import atexit
import sys

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

Bu şekilde sekme tamamlama ve önceki geçmişe erişmeye devam edebilirsiniz, ancak girdiğiniz komutlar geçmiş dosyasına eklenmez.


Bu işe yaramaz gibi görünüyor (Arch Linux üzerinde Python 3.5.1), geçmiş dosyası hala PYTHONSTARTUPkomut dosyası aracılığıyla bile çıkışta yazılır .
Lekensteyn

Ben sadece Arch Linux vm üzerinde test ettim ve iyi çalışıyor: gist.github.com/berdario/640b3ab00b128fdf3338
berdario

0

İşte benim yöntem (temelde berdario yönteminin daha güvenilir ve pythonic bir versiyonu olduğu ortaya çıktı). Yalnızca varsa yazmayı devre dışı bırakır .python_history, ancak varsa okuma veya geçerli örneğin geçmişine yeni satırlar eklemeyi devre dışı bırakır . Ben olarak kaydederek tavsiye site-packages/sitecustomize.pyçünkü sitehem yazar olduğu modüldür .python_historyve ithalat sitecustomizevarsa o başka bir şey adlandırma ve birlikte o işaret rağmen, PYTHONSTARTUPçok işler.

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

güncelleme: 3.7 için yaptığım, sistemime özgü, pep8 için değil:

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

Python 3.7.3. Çalışmıyor. Geçmiş hala kaydediliyor.
Boann

0

Geçerli çözümüm (Python 3'ün son yeterli sürümleri için) ~ / .python_history'nin varsayılan kullanımını önler, ancak geçmişin belirli bir dosyaya (readline.write_history_file (dosyaadı) veya readline.append_history_file (... )) kişinin PYTHONSTARTUP dosyasında aşağıdakilere sahip olması gerekir:

import readline
import time

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

Açıkça yazılmış herhangi bir tarihi, tercümanın başlangıç ​​zamanı ile etiketleyen hoş (benim için) yan etkiye sahiptir. Burada görülebilen hata 5845 düzeltmesi nedeniyle çalışır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.