पायथन इंटरेक्टिव सेशन को कैसे बचाएं?


416

मैं अपने आप को अक्सर डेटाबेस, फाइलों, आदि के साथ काम करने के लिए पायथन इंटरप्रेटर का उपयोग करते हुए पाता हूं - मूल रूप से सेमी-स्ट्रक्चर्ड डेटा का मैन्युअल स्वरूपण। मैं उपयोगी बिट्स को ठीक से सहेज और साफ नहीं करता हूं जितनी बार मैं चाहूंगा। क्या शेल में मेरे इनपुट को बचाने का एक तरीका है (डीबी कनेक्शन, चर असाइनमेंट, छोरों और तर्क के बिट्स के लिए थोड़ा) - इंटरैक्टिव सत्र का कुछ इतिहास? अगर मैं कुछ का उपयोग करता scriptहूं जैसे मुझे बहुत अधिक शोरगुल मिलता है। मुझे वास्तव में सभी वस्तुओं को अचार बनाने की आवश्यकता नहीं है - हालांकि अगर कोई समाधान है जो ऐसा करता है, तो यह ठीक होगा। आदर्श रूप से मैं सिर्फ एक स्क्रिप्ट के साथ रह जाऊंगा जो कि मैंने एक इंटरएक्टिव रूप से बनाया था, और मैं उन बिट्स को हटा सकता था जिनकी मुझे आवश्यकता नहीं थी। क्या कोई ऐसा पैकेज है जो ऐसा करता है, या एक DIY दृष्टिकोण है?

अद्यतन : मैं वास्तव में इन पैकेजों की गुणवत्ता और उपयोगिता पर चकित हूं। समान खुजली वाले लोगों के लिए:

  • IPython - उम्र के लिए इसका उपयोग करना चाहिए था, जिस तरह का मेरे मन में था
  • पुनर्संरचना - बहुत प्रभावशाली, मैं विज़ुअलाइज़ेशन के बारे में अधिक सीखना चाहता हूं और ऐसा लगता है कि यह वहां चमक जाएगा। एक gtk / सूक्ति डेस्कटॉप ऐप की तरह जो रेखांकन इनलाइन को प्रस्तुत करता है। हाइब्रिड शेल + ग्राफिंग कैलकुलेटर + मिनी ग्रहण की कल्पना करें। स्रोत वितरण यहां: http://www.reinteract.org/trac/wiki/GettingIt । उबंटू पर निर्मित ठीक है, सूक्ति डेस्कटॉप, विंडोज और मैक इंस्टालर में भी एकीकृत है।
  • bpython - बहुत अच्छा, बहुत सारी अच्छी सुविधाएँ, स्वतः पूर्ण (!), रिवाइंड, एक कीस्ट्रोके को फ़ाइल, इंडेंटेशन, अच्छी तरह से करने के लिए सहेजें। पायथन स्रोत वितरण, sourceforge से निर्भरता के एक जोड़े को खींच लिया।

मैं रूपांतरित हो गया हूं, ये वास्तव में दुभाषिया और संपादक के बीच एक आवश्यकता भर हैं।

जवाबों:


411

यदि आप इंटरेक्टिव सत्र का उपयोग करना पसंद करते हैं तो IPython बेहद उपयोगी है। आपके उपयोग-मामले के लिए उदाहरण के लिए नहीं है जादू आदेश , तुम बस इनपुट इनपुट लाइनों 10 से 20 और 23 को बचाने के लिए (इस काम में सहायता करने के लिए, हर पंक्ति संख्या लगाया जाता है)।%save%save my_useful_session 10-20 23my_useful_session.py

इसके अलावा, दस्तावेज़ बताता है:

यह फ़ंक्शन इनपुट श्रेणियों के लिए % इतिहास के समान सिंटैक्स का उपयोग करता है, फिर आपके द्वारा निर्दिष्ट फ़ाइल नाम के लिए लाइनों को बचाता है।

यह उदाहरण के लिए, पुराने सत्रों को संदर्भित करने की अनुमति देता है, जैसे कि

%save current_session ~0/
%save previous_session ~1/

पर देखो प्रस्तुति पृष्ठ पर वीडियो सुविधाओं की एक त्वरित अवलोकन के लिए।


11
सभी लाइनों को कैसे बचाया जाए? सीमा को निर्दिष्ट किए बिना, यह एक खाली फ़ाइल बनाता है। :(
बाल्की

40
@balki, IPython का संकेत बताता है कि आपके इतिहास में कितनी लाइनें हैं (यानी In[48])। तो save filename 1-48आपके पूरे सत्र को बचा लेगा।
बेन पेज 10

2
इसके अलावा, क्या इस फाइल को वापस ipython में लोड करना और अपने इनपुट इतिहास को बरकरार रखना संभव है?
बेन पेज

15
@BenPage सहेजे गए .py फ़ाइल पर "ipython -i [फ़ाइल नाम]" का उपयोग करें, एक इंटरैक्टिव कंसोल पर लौटने से पहले फ़ाइल को वापस लोड करने के लिए bash promt से! (बिना -आई ध्वज के आपको फ़ाइल चलाने के बाद इंटरैक्टिव कंसोल नहीं मिलता है)।
सैमुअल लम्पा

9
@ user4779, जैसा कि कोई उम्मीद करता है:%load my_useful_session
डैनियल सेरोडियो

167

http://www.andrewhjon.es/save-interactive-python-session-history

import readline
readline.write_history_file('/home/ahj/history')

10
विंडोज 7 पर मेरे लिए एक खाली फ़ाइल बनाता है
ubershmekel

10
उबंटू में मेरे लिए एक आकर्षण की तरह काम किया।
जॉन्ड्ट

4
@ubershmekel - ऐसा लगता है कि यह केवल यूनिक्स पर काम करता है
जोएल बी

28
मेरे टीआई -83
डेन

1
अपने सत्र के अंत में इसे करना याद रखें। केवल शुरुआत में ही फ़ंक्शन को कॉल करने के बाद मेरा थोड़ा खाली दिख रहा था।
डॉल्फस ३३३

95

इसे करने का एक तरीका है। फ़ाइल को इसमें संग्रहीत करें ~/.pystartup...

# Add auto-completion and a stored history file of commands to your Python
# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
# bound to the Esc key by default (you can change it - see readline docs).
#
# Store the file in ~/.pystartup, and set an environment variable to point
# to it:  "export PYTHONSTARTUP=/home/user/.pystartup" in bash.
#
# Note that PYTHONSTARTUP does *not* expand "~", so you have to put in the
# full path to your home directory.

import atexit
import os
import readline
import rlcompleter

historyPath = os.path.expanduser("~/.pyhistory")

def save_history(historyPath=historyPath):
    import readline
    readline.write_history_file(historyPath)

if os.path.exists(historyPath):
    readline.read_history_file(historyPath)

atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath

और फिर PYTHONSTARTUPअपने शेल (जैसे में ~/.bashrc) में पर्यावरण चर सेट करें :

export PYTHONSTARTUP=$HOME/.pystartup

आप इसे मुफ्त में स्वतः पूर्ण करने के लिए भी जोड़ सकते हैं:

readline.parse_and_bind('tab: complete')

कृपया ध्यान दें कि यह केवल * nix सिस्टम पर काम करेगा। जैसा कि रीडलाइन केवल यूनिक्स प्लेटफॉर्म में उपलब्ध है।


Mac OS X एडिटलाइन का उपयोग करता है, इसलिए टैब-पूर्ण कार्यक्षमता उपलब्ध है, लेकिन सटीक कमांड अलग है: readline.parse_and_bind ("bind ^ I rl_complete")
Miles

वह तेज पागल था, नादिया, बहुत धन्यवाद। मैं दोनों जवाबों की कोशिश करूंगा - लक्ष्य मंच उबंटू, बीटीडब्लू
अनमाउंटेड

readline.parse_and_bind('tab: complete')यदि आप MacPorts Python का उपयोग करते हैं तो काम करता है।
फिलिप क्लाउड

3
इसे फंसाया जाना चाहिए। आरएचईएल 6.6 पर काम किया। पाइनेव, 2.7.10।
बिलिअम

मैंने इन सभी वर्षों में इसे क्यों नहीं खोजा! यह समाधान मूल उपकरण के रूप में महान है जो तेज और हल्का है।
iman

75

यदि आप IPython का उपयोग कर रहे हैं, तो आप -f पैरामीटर के साथ जादुई फ़ंक्शन % इतिहास का उपयोग करके अपने सभी पिछले आदेशों को एक फ़ाइल में सहेज सकते हैं :

%history -f /tmp/history.py

saveजादू का उपयोग कर फ़ाइल के स्थान के बारे में निश्चित नहीं है । यह बहुत उपयोगी था
अल्फा_989

4
%history -g -f full_history.pyसभी सत्रों से इतिहास प्राप्त करने के लिए उपयोग करें , न कि केवल वर्तमान एक। यह भी देखें: % इतिहास के लिए दस्तावेज़
एवगेनी सर्गेव

19

Ipython स्थापित करने के बाद , और कमांड चलाकर Ipython सत्र खोलें:

ipython

अपनी कमांड लाइन से, बस अपने पूरे Ipython सत्र को स्वचालित रूप से लॉग करने के लिए निम्नलिखित Ipython 'मैजिक' कमांड चलाएँ:

%logstart

यह एक विशिष्ट रूप से नामित .py फ़ाइल बनाएगा और आपके सत्र को बाद में इंटरएक्टिव Ipython सत्र के रूप में उपयोग करने के लिए या आपके चयन की स्क्रिप्ट में उपयोग के लिए संग्रहीत करेगा।



11

IPython के अलावा, एक समान उपयोगिता वाले bpython में "फ़ाइल में दर्ज किया गया कोड सहेजें" सुविधा है


3
किसी को कैसे समझा जा सकता है कि यह bpython के साथ कैसे किया जाता है? मैंने ctrl + s की कोशिश की, लेकिन यह काम नहीं किया (संस्करण ०.१४.२ पायथन के शीर्ष पर ३.३.३ गनोम टर्मिनल चल रहा है)
Yibo यांग

यह डिफ़ॉल्ट रूप से F7 के लिए बाध्य है। एफ 1 आपको सहायता और वर्तमान कीबाइंडिंग दिखाएगा।
जिम के

F7 ने बाहरी संपादक को लॉन्च किया। Ctrl + s को फाइल सेव करने के लिए एक सरल सेव के लिए संकेत देना चाहिए, लेकिन यह bash और zsh में "बंद" करने के लिए बाध्य है, इसलिए आपको bpython config में एक विकल्प चुनने की आवश्यकता होगी।
RCross

8

मुझे एक जवाब खोजने के लिए संघर्ष करना पड़ा, मैं iPython वातावरण के लिए बहुत नया था।

यह काम करेगा

यदि आपका iPython सत्र ऐसा दिखता है

In [1] : import numpy as np
....
In [135]: counter=collections.Counter(mapusercluster[3])
In [136]: counter
Out[136]: Counter({2: 700, 0: 351, 1: 233})

आप 1 से 135 तक लाइनों को बचाना चाहते हैं, फिर उसी ipython सत्र पर इस कमांड का उपयोग करें

In [137]: %save test.py 1-135

यह आपके मौजूदा निर्देशिका (जहाँ आपने ipython को शुरू किया था) में टेस्टोस्टेरोन फ़ाइल में आपके सभी अजगर बयानों को बचाएगा।


3

इनपुट इतिहास (और वैकल्पिक रूप से आउटपुट) को प्रिंट करने और सहेजने के लिए% इतिहास जादू है।

अपने वर्तमान सत्र को एक फ़ाइल में संग्रहीत करने के लिए जिसका नाम है my_history.py:

>>> %hist -f my_history.py

इतिहास IPython आपके द्वारा दर्ज किए गए दोनों आदेशों को संग्रहीत करता है, और इसके परिणाम उत्पन्न करता है। आप आसानी से ऊपर और नीचे-तीर कुंजी के साथ पिछले आदेशों के माध्यम से जा सकते हैं, या अपने इतिहास को अधिक परिष्कृत तरीकों से एक्सेस कर सकते हैं।

आप पिछले इनपुट और आउटपुट की जांच करने के लिए% इतिहास जादू फ़ंक्शन का उपयोग कर सकते हैं। पिछले सत्रों से इनपुट इतिहास को एक डेटाबेस में सहेजा जाता है, और आउटपुट इतिहास को बचाने के लिए IPython को कॉन्फ़िगर किया जा सकता है।

कई अन्य मैजिक फ़ंक्शंस आपके इनपुट इतिहास का उपयोग कर सकते हैं, जिसमें% एडिट,% रेरन,% रिकॉल,% मैक्रो,% सेव और% पास्टबीन शामिल हैं। आप लाइनों को संदर्भित करने के लिए एक मानक प्रारूप का उपयोग कर सकते हैं:

%pastebin 3 18-20 ~1/1-5

यह वर्तमान सत्र से लाइन 3 और लाइनें 18 से 20 और पिछले सत्र से 1-5 पंक्ति में ले जाएगा।

% इतिहास देखें? डॉकस्ट्रिंग और अधिक उदाहरणों के लिए।

इसके अलावा, आईपीथॉन में चर के हल्के दृढ़ता के लिए % स्टोर मैजिक की क्षमताओं का पता लगाना सुनिश्चित करें ।

IPython के डेटाबेस में वैरिएबल, अलायस और मैक्रोज़ को स्टोर करता है।

d = {'a': 1, 'b': 2}
%store d  # stores the variable
del d

%store -r d  # Refresh the variable from IPython's database.
>>> d
{'a': 1, 'b': 2}

स्टार्टअप पर संग्रहीत चर को c.StoreMagic.autorestore = Trueऑटोरेस्‍टोर करने के लिए , ipython_config.py में निर्दिष्ट करें ।


c.HistoryManager.db_log_outputविन्यास फाइल को सक्षम करके आउटपुट हिस्ट्री को एनेबल किया जा सकता है ।
इक्के

3

बस कटोरे में एक और सुझाव देते हुए: स्पाइडर

यहां छवि विवरण दर्ज करें

इसमें हिस्ट्री लॉग और वेरिएबल एक्सप्लोरर है । यदि आपने माटलाब के साथ काम किया है, तो आपको समानताएँ दिखाई देंगी।


2

जहां तक ​​लिनक्स जाता है, कोई भी scriptपूरे सत्र को रिकॉर्ड करने के लिए कमांड का उपयोग कर सकता है । यह util-linuxपैकेज का हिस्सा है इसलिए अधिकांश लिनक्स सिस्टम पर होना चाहिए। आप बना सकते हैं और उपनाम या फ़ंक्शन जो कॉल करेगा script -c pythonऔर जो typescriptफ़ाइल में सहेजा जाएगा । उदाहरण के लिए, इस तरह की एक फ़ाइल का पुनर्मुद्रण है।

$ cat typescript                                                                                                      
Script started on Sat 14 May 2016 08:30:08 AM MDT
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 'Hello Pythonic World'
Hello Pythonic World
>>> 

Script done on Sat 14 May 2016 08:30:42 AM MDT

यहां छोटा नुकसान यह है कि scriptरिकॉर्ड सब कुछ, यहां तक ​​कि लाइन-फीड, जब भी आप बैकस्पेस से टकराते हैं, आदि तो आप colआउटपुट को साफ करने के लिए उपयोग करना चाह सकते हैं ( इस पोस्ट को यूनिक्स और लिनक्स स्टैकएक्सचेंज पर देखें )।


2

%historyआदेश भयानक है, लेकिन दुर्भाग्य से यह नहीं दूँगी आप चीजें हैं जो sesh में% पेस्ट 'घ थे सहेजें। ऐसा करने के लिए मुझे लगता है कि आपको %logstart शुरुआत में करना होगा (हालांकि मैंने इस काम की पुष्टि नहीं की है)।

मुझे क्या करना पसंद है

%history -o -n -p -f filename.txt

जो प्रत्येक इनपुट (ओ, एन, और पी विकल्प) से पहले आउटपुट, लाइन नंबर और '>>>' को बचाएगा। % इतिहास के लिए यहां डॉक्स देखें ।


1

एक और विकल्प है --- pyslice। "wxpython 2.8 डॉक्स डेमो और टूल्स" में, "pyslices" नाम का एक ओपन सोर्स प्रोग्राम है।

आप इसे एक संपादक की तरह उपयोग कर सकते हैं, और यह एक कंसोल की तरह भी समर्थन करता है ---- तत्काल गूंज के साथ एक इंटरैक्टिव दुभाषिया की तरह प्रत्येक पंक्ति को निष्पादित करना।

बेशक, प्रत्येक ब्लॉक के कोड और परिणाम के सभी ब्लॉक स्वचालित रूप से एक txt फ़ाइल में दर्ज किए जाएंगे।

परिणाम कोड के संगत ब्लॉक के पीछे लॉग इन होते हैं। बहुत ही सुविधाजनक।

Pyslices का अवलोकन


PySlices लेखक यहाँ। खुशी है कि आप PySlices को पसंद करते हैं (और यह कि आपने इसे पाया भी)। यह अभी तक बहुत अधिक परित्याग नहीं है (मैं वास्तव में अभी भी इसका उपयोग करता हूं), लेकिन wxPython में शामिल संस्करण अक्सर अच्छा काम नहीं करता है। यदि आप अद्यतनों का पालन करना चाहते हैं तो आप उन्हें wx_py पैकेज से प्राप्त कर सकते हैं: pypi.python.org/pypi/wx_py , github.com/davidmashburn/wx_py
David

1

यदि आप bpython का उपयोग करते हैं , तो आपके सभी कमांड इतिहास डिफ़ॉल्ट रूप से सहेजे गए हैं ~/.pythonhist

बाद में पुन: उपयोग के लिए आदेशों को सहेजने के लिए आप उन्हें एक अजगर स्क्रिप्ट फ़ाइल में कॉपी कर सकते हैं:

$ cp ~/.pythonhist mycommands.py

फिर इसे साफ करने के लिए उस फाइल को संपादित करें और इसे पायथन पथ के नीचे रख दें (वैश्विक या आभासी पर्यावरण के साइट-पैकेज, वर्तमान निर्देशिका, * .pth, या किसी अन्य तरीके से उल्लेख करते हुए) के तहत डालें।

अपने शेल में आदेशों को शामिल करने के लिए, उन्हें सहेजे गए फ़ाइल से आयात करें:

>>> from mycommands import *

जीवन रक्षक। उत्तर खोजने के लिए एक कठिन
मेहदी लामरानी

0

कुछ टिप्पणियां पूछ रही थीं कि कैसे एक बार में सभी IPython आदानों को बचाया जाए। आईपिथॉन में% सेव मैजिक के लिए, आप प्रोग्राम के सभी कमांड्स को नीचे दिखाए गए अनुसार बचा सकते हैं, शीघ्र संदेश से बचने के लिए और इनपुट नंबर को निर्दिष्ट करने से भी बचने के लिए। currentLine = len (In) -1% save -f my_session 1- $ currentLine

-fविकल्प फ़ाइल प्रतिस्थापन और मजबूर कर के लिए प्रयोग किया जाता है len(IN)-1पता चलता है वर्तमान इनपुट IPython में शीघ्र, आप पूरे सत्र प्रोग्राम के रूप में बचाने के लिए अनुमति देता है।


0

उपयोग करने वालों के लिए spacemacs, और ipythonजो आता है python-layer, जादू को बचाने के लिए बहुत सारे अवांछित आउटपुट पैदा करते हैं, क्योंकि लगातार ऑटो-कमांड पूरी तरह से बैकग्राउंड में काम कर रहा है:

len(all_suffixes)
';'.join(__PYTHON_EL_get_completions('''len'''))
';'.join(__PYTHON_EL_get_completions('''all_substa'''))
len(all_substantives_w_suffixes)
';'.join(__PYTHON_EL_get_completions('''len'''))
';'.join(__PYTHON_EL_get_completions('''all'''))
';'.join(__PYTHON_EL_get_completions('''all_'''))
';'.join(__PYTHON_EL_get_completions('''all_w'''))
';'.join(__PYTHON_EL_get_completions('''all_wo'''))
';'.join(__PYTHON_EL_get_completions('''all_wor'''))
';'.join(__PYTHON_EL_get_completions('''all_word'''))
';'.join(__PYTHON_EL_get_completions('''all_words'''))
len(all_words_w_logograms)
len(all_verbs)

इससे बचने के लिए बस आइपियन बफर को बचाएं जैसे आप सामान्य रूप से किसी अन्य को बचाते हैं: spc f s


0

मैं लिनक्स पर tmux के माध्यम से अजगर सत्र को बनाए रखने के लिए एक और तरीका सुझाना चाहूंगा। आप tmux चलाते हैं, अपने स्व को आपके द्वारा खोले गए सत्र में संलग्न करें (यदि इसे सीधे खोलने के बाद संलग्न नहीं किया गया है)। अजगर पर अमल करो और जो कुछ भी तुम उस पर कर रहे हो उसे करो। फिर सत्र से अलग करना। tmux सत्र से कोचिंग सत्र बंद नहीं करता है। सत्र खुला रहता है।

इस विधि के नियम: आप इस सत्र को किसी अन्य उपकरण से संलग्न कर सकते हैं (यदि आप अपने पीसी को शश कर सकते हैं)

इस विधि की विपक्ष: यह विधि खुले अजगर सत्र द्वारा उपयोग किए गए संसाधनों को तब तक त्याग नहीं करती है जब तक आप वास्तव में अजगर दुभाषिया मौजूद नहीं करते हैं।


0

XUbuntu पर इनपुट और आउटपुट बचाने के लिए :

  1. XWindows में, Xfce टर्मिनल ऐप से iPython चलाएं
  2. Terminalशीर्ष मेनू बार में क्लिक करें और save contentsड्रॉपडाउन में देखें

मुझे लगता है कि यह इनपुट और आउटपुट बचाता है, जब मैंने टर्मिनल खोला तो सभी रास्ते वापस आ गए। यह ipython विशिष्ट नहीं है, और यह ssh सत्र या टर्मिनल विंडो से चलने वाले अन्य कार्यों के साथ काम करेगा।

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