ฉันจะปิดการใช้งานคุณสมบัติประวัติใหม่ใน Python 3.4 ได้อย่างไร


10

ตั้งแต่การอัพเกรดเป็นงูหลาม 3.4 ~/.python_historyคำสั่งแบบโต้ตอบทั้งหมดจะถูกบันทึกลงใน ฉันไม่ต้องการให้ Python สร้างหรือเขียนไฟล์นี้

การสร้าง symlink /dev/nullไม่ทำงาน Python จะลบไฟล์และสร้างใหม่ เอกสารแนะนำให้ลบsys.__interactivehook__แต่ยังเอาแท็บเสร็จ สิ่งที่ควรทำเพื่อปิดใช้งานการเขียนไฟล์ประวัตินี้ แต่ยังคงรักษาความสมบูรณ์ของแท็บไว้

รายละเอียดเพิ่มเติม:


คุณลอง chowning มันเพื่อรูท?
goldilocks

@goldilocks chattrฉันไม่ได้พิจารณาว่าวิธีการแก้ปัญหาที่ยอมรับได้และค่าใช้ ฉันกำลังมองหาไฟล์กำหนดค่า (ผู้ใช้) เดียวหรือตัวแปรสภาพแวดล้อม
Lekensteyn

โอเค แต่คุณรู้อยู่แล้วว่าไม่มีวิธีแก้ปัญหาที่ยอมรับได้ดังกล่าวตั้งแต่คุณดูเอกสาร
goldilocks

ในความเป็นจริงchmodเป็นวิธีการแก้ปัญหาที่แนะนำโดยงูใหญ่ devs ในรายงานข้อผิดพลาดจากไม่กี่สัปดาห์ที่ผ่านมาแม้ว่าจะมีการกล่าวถึงบางอย่างที่~/.inputrcนั่น (ไม่มีman readlineBTW ยกเว้นฟังก์ชั่นห้องสมุด)
goldilocks

@goldilocks ใช่ฉันกำลังจะเชื่อมโยงไปยังรายงานข้อผิดพลาดนั้น ฉันไม่รู้ว่าจะใช้อย่างไรinputrcและchmodไม่ได้ผลสำหรับฉันเช่นกันไฟล์ได้รับการแก้ไขแล้ว (Arch Linux) มีinfo inputrcหน้าอยู่ แต่โดยทั่วไปฉันไม่ค่อยมีความสุขกับการอ่านหน้าข้อมูลเพราะมันยากที่จะสำรวจ
Lekensteyn

คำตอบ:


7

ตั้งแต่ Python 3.6 คุณสามารถใช้readline.set_auto_historyเพื่อปิดการใช้งานนี้:

import readline
readline.set_auto_history(False)

มันดีสำหรับเชลล์ Python แต่ระวัง: มันไม่ทำงานใน ipython
z0r

สิ่งนี้ปิดใช้งานประวัติทั้งหมด โดยส่วนตัวฉันสบายดีกับประวัติถูกเก็บรักษาไว้ในเซสชันล่ามของฉัน แต่ฉันไม่ต้องการให้เขียนประวัติลงในดิสก์และเก็บรักษาข้ามเซสชัน
jamesdlin

ใช้งานไม่ได้ สิ่งนี้จะไม่หยุดการบันทึกไฟล์และจะเป็นการแบ่งประวัติระหว่างเซสชั่น ไม่ว่าในกรณีใด Python จะเปลี่ยน "ฟีเจอร์" ในครั้งถัดไปที่คุณเรียกใช้
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

@Lekensteyn: ใช่มันทำให้ขนาดประวัติเท่ากับศูนย์ดังนั้นจึงไม่มีสิ่งใดถูกเขียนลงไฟล์ประวัติ โอ้ฉันว่าคุณต้องการรักษาคำสั่งระหว่างเซสชัน
cuonglm

2
สิ่งนี้ยังทำให้เกิด~/.python_historyการเขียน (ตรวจสอบกับPYTHONSTARTUP=$HOME/.pythonrc strace -e file,write -o /tmp/st python) ผมเริ่มคิดว่ามีวิธีที่จะปิดการใช้งานนี้ /usr/lib/python3.4/site.pyแต่ให้แท็บเสร็จโดยไม่ต้องทำซ้ำโค้ดจาก
Lekensteyn

AFAIK ไม่มีวิธีใดที่จะปิดการใช้งานจริงๆ
cuonglm

2

อีกวิธีแก้ปัญหา ~ / .pythonrc:

import readline
readline.write_history_file = lambda *args: None

ฉันไม่รู้ว่าทำไมสิ่งนี้ถึงไม่ได้รับการโหวตเพิ่มอีก นี่เป็นวิธีที่ง่ายและระงับการเขียนไฟล์ประวัติโดยตรงแทนการปิดใช้งานประวัติทั้งหมด
jamesdlin

นี่คือการแก้ไขเดียวที่ทำงานสำหรับฉัน ขอบคุณ
Boann

1

ในการป้องกัน Python จากการเขียน~/.python_historyให้ปิดการใช้งาน hookที่เปิดใช้งานฟังก์ชันนี้:

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

จนกว่ามันจะได้รับการแก้ไขใน Python คุณสามารถทำได้บนระบบ UNIX:

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

หลังจากนั้นคุณจะได้รับ

ข้อผิดพลาดใน atexit._run_exitfuncs:

IsADirectoryError: [Errno 21] เป็นไดเรกทอรี

ทุกครั้งที่คุณยุติ python shell 0สถานะออกจะยังคงเป็น

โปรดสังเกตว่าหากคุณปล่อยไว้เป็นไฟล์คุณต้องสร้างและสร้างไฟล์อื่นที่ไม่เปลี่ยนรูป ~/.python_history


0

วางสิ่งต่อไปนี้ในไฟล์และตั้งค่าPYTHONSTARTUPเป็น (หรือเรียกไฟล์sitecustomize.pyและทำให้สามารถเข้าถึงได้จากPYTHONPATH)

import readline
import atexit
import sys

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

วิธีนี้คุณจะยังคงสามารถเข้าถึงการกรอกข้อมูลในแท็บและประวัติก่อนหน้าได้ แต่คำสั่งที่คุณป้อนจะไม่ถูกเพิ่มลงในไฟล์ประวัติ


ดูเหมือนว่าจะไม่ทำงาน (Python 3.5.1 บน Arch Linux) ไฟล์ประวัติจะยังคงเขียนเมื่อออกแม้ผ่านPYTHONSTARTUPสคริปต์จะดำเนินการแน่นอน
Lekensteyn

ฉันเพิ่งทดสอบบน Arch Linux 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

Python 3.7.3 ไม่ทำงาน. ประวัติยังคงถูกบันทึกไว้
Boann

0

โซลูชันปัจจุบันของฉัน (สำหรับ Python 3 รุ่นล่าสุดเพียงพอ) ป้องกันการใช้งานเริ่มต้นของ ~ / .python_history แต่ทิ้งความเป็นไปได้ของการเขียนประวัติอย่างชัดเจนไปยังไฟล์ที่กำหนด (โดยใช้ readline.write_history_file (filename) หรือ 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ซึ่งสามารถเห็นได้ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.