Làm cách nào để lưu phiên tương tác Python?


416

Tôi thấy mình thường xuyên sử dụng trình thông dịch của Python để làm việc với cơ sở dữ liệu, tệp, v.v. - về cơ bản rất nhiều định dạng thủ công của dữ liệu bán cấu trúc. Tôi không lưu đúng cách và dọn sạch các bit hữu ích thường xuyên như tôi muốn. Có cách nào để lưu dữ liệu đầu vào của tôi vào hệ vỏ (kết nối db, phép gán biến, ít cho các vòng lặp và bit logic) - một số lịch sử của phiên tương tác không? Nếu tôi sử dụng một cái gì đó như scripttôi nhận được quá nhiều tiếng ồn. Tôi thực sự không cần phải chọn tất cả các đối tượng - mặc dù nếu có một giải pháp thực hiện điều đó, nó sẽ ổn thôi. Lý tưởng nhất là tôi sẽ chỉ còn lại một đoạn script chạy như kịch bản mà tôi đã tạo tương tác và tôi có thể xóa các bit tôi không cần. Có một gói làm điều này, hoặc một phương pháp DIY?

CẬP NHẬT : Tôi thực sự ngạc nhiên về chất lượng và tính hữu ích của các gói này. Đối với những người bị ngứa tương tự:

  • IPython - nên đã sử dụng điều này từ lâu, loại suy nghĩ của tôi
  • reactact - rất ấn tượng, tôi muốn tìm hiểu thêm về trực quan hóa và điều này có vẻ như nó sẽ tỏa sáng ở đó. Sắp xếp một ứng dụng máy tính để bàn gtk / gnome hiển thị biểu đồ nội tuyến. Hãy tưởng tượng một vỏ lai + máy tính vẽ đồ thị + nhật thực nhỏ. Phân phối nguồn tại đây: http://www.reinteract.org/trac/wiki/GettingIt . Được xây dựng tốt trên Ubuntu, tích hợp vào máy tính để bàn gnome, trình cài đặt Windows và Mac.
  • bpython - cực kỳ hay, nhiều tính năng hay, tự động hoàn thành (!), tua lại, một lần nhấn phím để lưu vào tệp, thụt lề, hoàn thành tốt. Phân phối nguồn Python, đã kéo một vài phụ thuộc từ sourceforge.

Tôi đã được chuyển đổi, những điều này thực sự đáp ứng nhu cầu giữa phiên dịch viên và biên tập viên.

Câu trả lời:


411

IPython cực kỳ hữu ích nếu bạn thích sử dụng các phiên tương tác. Ví dụ cho việc sử dụng hợp cụ thể của bạn có các %savelệnh ma thuật , bạn chỉ cần đầu vào %save my_useful_session 10-20 23để lưu dòng đầu vào từ 10 đến 20 và 23 đến my_useful_session.py(để giúp đỡ với điều này, mỗi dòng được bắt đầu bằng số của nó).

Hơn nữa, các tài liệu nêu:

Hàm này sử dụng cú pháp tương tự như % history cho các phạm vi đầu vào, sau đó lưu các dòng vào tên tệp bạn chỉ định.

Điều này cho phép, ví dụ, để tham khảo các phiên cũ hơn, chẳng hạn như

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

Nhìn vào các video trên trang thuyết trình để có cái nhìn tổng quan về các tính năng.


11
Làm thế nào để lưu tất cả các dòng? Không chỉ định phạm vi, nó tạo ra một tệp trống. :(
balki

40
@balki, lời nhắc của IPython cho bạn biết có bao nhiêu dòng trong lịch sử của bạn (tức là In[48]). Vì vậy, save filename 1-48sẽ lưu toàn bộ phiên của bạn.
Ben Trang

2
Ngoài ra, có thể tải lại tệp này vào ipython và giữ nguyên lịch sử nhập liệu của bạn không?
Ben Trang

15
@BenPage Sử dụng "ipython -i [tên tệp]" trên tệp .py đã lưu, từ quảng cáo bash để tải lại tệp trước khi quay lại bảng điều khiển tương tác! (không có cờ -i, bạn không nhận được bảng điều khiển tương tác sau khi chạy tệp).
Samuel Lampa

9
@ user4779, như mọi người mong đợi:%load my_useful_session
Daniel Serodio

167

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

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

10
Tạo một tệp trống cho tôi trên windows 7
ubershmekel

10
Làm việc như một cơ duyên đối với tôi trong Ubuntu.
Johndt6

4
@ubershmekel - Có vẻ như nó chỉ hoạt động trên Unix
Joel B

28
Thất bại trên TI-83 của tôi
Dan

1
Hãy nhớ làm điều đó vào cuối phiên của bạn. Của tôi đã trông hơi trống rỗng sau khi gọi chức năng chỉ khi bắt đầu.
cá heo333

95

Có một cách để làm điều đó. Lưu trữ tệp trong ~/.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

và sau đó đặt biến môi trường PYTHONSTARTUPtrong trình bao của bạn (ví dụ: trong ~/.bashrc):

export PYTHONSTARTUP=$HOME/.pystartup

Bạn cũng có thể thêm phần này để nhận tự động hoàn thành miễn phí:

readline.parse_and_bind('tab: complete')

Xin lưu ý rằng điều này sẽ chỉ hoạt động trên các hệ thống * nix. Vì readline chỉ có sẵn trong nền tảng Unix.


Mac OS X sử dụng editline, do đó có sẵn chức năng hoàn thành tab, nhưng lệnh chính xác thì khác: readline.parse_and_bind ("bind ^ I rl_complete")
Miles

Thật là điên rồ, Nadia, cảm ơn rất nhiều. Tôi sẽ thử cả hai câu trả lời - nền tảng mục tiêu là Ubuntu, BTW
chưa được cập nhật vào

readline.parse_and_bind('tab: complete')hoạt động nếu bạn sử dụng MacPorts Python.
Đám mây Phillip

3
Điều này nên được đóng khung. Đã làm việc trên RHEL 6.6. Pyenv, 2.7.10.
BilliAm

Tại sao tôi không tìm kiếm tất cả những năm này! Giải pháp này là tuyệt vời khi sử dụng công cụ ban đầu nhanh và nhẹ.
iman

75

Nếu bạn đang sử dụng IPython, bạn có thể lưu vào một tệp tất cả các lệnh trước đó bằng cách sử dụng hàm ma thuật % history với tham số -f , pe:

%history -f /tmp/history.py

Không chắc chắn về vị trí của tập tin bằng savephép thuật. Điều này rất hữu ích
alpha_989

4
Sử dụng %history -g -f full_history.pyđể lấy lịch sử từ tất cả các phiên, không chỉ phiên hiện tại. Xem thêm: tài liệu cho% history .
Evgeni Sergeev

19

Sau khi cài đặt Ipython và mở phiên Ipython bằng cách chạy lệnh:

ipython

từ dòng lệnh của bạn, chỉ cần chạy lệnh 'ma thuật' Ipython sau để tự động đăng nhập toàn bộ phiên Ipython của bạn:

%logstart

Điều này sẽ tạo một tệp .py có tên duy nhất và lưu trữ phiên của bạn để sử dụng sau này dưới dạng phiên Ipython tương tác hoặc để sử dụng trong (các) tập lệnh bạn chọn.



11

Ngoài IPython, một bpython tiện ích tương tự có tính năng "lưu mã bạn đã nhập vào tệp"


3
bất cứ ai có thể giải thích làm thế nào điều này được thực hiện với bpython? Tôi đã thử ctrl + s nhưng nó không hoạt động (phiên bản 0.14.2 trên đầu Python 3.4.3 chạy thiết bị đầu cuối Gnome)
Yibo Yang

Nó được ràng buộc với F7 theo mặc định. F1 sẽ cho bạn thấy sự giúp đỡ và các phím bấm hiện tại.
Jim K.

F7 ra mắt trình soạn thảo bên ngoài. Ctrl + s nên nhắc về tính năng lưu vào tệp đơn giản, nhưng nó bị ràng buộc là "dừng" trong bash và zsh, vì vậy bạn sẽ cần chọn một thay thế trong cấu hình bpython.
RCross

8

Tôi đã phải vật lộn để tìm câu trả lời, tôi rất mới với môi trường iPython.

Điều này sẽ làm việc

Nếu phiên iPython của bạn trông như thế này

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})

Bạn muốn lưu các dòng từ 1 đến 135 sau đó trên cùng một phiên ipython sử dụng lệnh này

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

Điều này sẽ lưu tất cả các câu lệnh python của bạn trong tệp test.txt trong thư mục hiện tại của bạn (nơi bạn đã khởi tạo ipython).


3

Có% ma thuật lịch sử để in và lưu lịch sử đầu vào (và tùy chọn đầu ra).

Để lưu trữ phiên hiện tại của bạn vào một tệp có tên my_history.py:

>>> %hist -f my_history.py

Lịch sử IPython lưu trữ cả các lệnh bạn nhập và kết quả mà nó tạo ra. Bạn có thể dễ dàng thực hiện các lệnh trước đó bằng các phím mũi tên lên và xuống hoặc truy cập vào lịch sử của mình theo những cách tinh vi hơn.

Bạn có thể sử dụng chức năng% history history để kiểm tra đầu vào và đầu ra trong quá khứ. Lịch sử đầu vào từ các phiên trước được lưu trong cơ sở dữ liệu và IPython có thể được cấu hình để lưu lịch sử đầu ra.

Một số chức năng ma thuật khác có thể sử dụng lịch sử nhập liệu của bạn, bao gồm% chỉnh sửa,% chạy lại,% gọi lại,% macro,% lưu và% pastebin. Bạn có thể sử dụng định dạng chuẩn để tham khảo các dòng:

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

Điều này sẽ lấy dòng 3 và dòng 18 đến 20 từ phiên hiện tại và dòng 1-5 từ phiên trước đó.

Xem% lịch sử? cho các chuỗi và nhiều ví dụ.

Ngoài ra, hãy chắc chắn khám phá các khả năng của % store ma thuật cho sự tồn tại nhẹ của các biến trong IPython.

Lưu trữ các biến, bí danh và macro trong cơ sở dữ liệu của 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}

Để tự động kiểm tra các biến được lưu trữ khi khởi động, chỉ định c.StoreMagic.autorestore = Truetrong ipython_config.py.


Kích hoạt lưu lịch sử đầu ra có thể được thực hiện bằng cách bật c.HistoryManager.db_log_outputtrong tệp cấu hình.
Ikke

3

Chỉ cần đặt một gợi ý khác trong bát: Spyder

nhập mô tả hình ảnh ở đây

Nó có Nhật ký lịch sửthám hiểm biến . Nếu bạn đã làm việc với MatLab, thì bạn sẽ thấy những điểm tương đồng.


2

Theo như Linux, người ta có thể sử dụng scriptlệnh để ghi lại toàn bộ phiên. Nó là một phần của util-linuxgói nên có trên hầu hết các hệ thống Linux. Bạn có thể tạo và bí danh hoặc chức năng sẽ gọi script -c pythonvà nó sẽ được lưu vào một typescripttệp. Ví dụ, đây là một bản in lại của một tập tin như vậy.

$ 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

Nhược điểm nhỏ ở đây là scriptghi lại mọi thứ, ngay cả nguồn cấp dữ liệu, bất cứ khi nào bạn nhấn vào không gian, v.v. Vì vậy, bạn có thể muốn sử dụng colđể dọn sạch đầu ra (xem bài đăng này trên Unix & Linux Stackexchange ).


2

Các %historylệnh là tuyệt vời, nhưng tiếc là nó sẽ không cho phép bạn tiết kiệm những thứ mà là% dán 'd vào Sesh. Để làm điều đó tôi nghĩ bạn phải làm %logstart ngay từ đầu (mặc dù tôi chưa xác nhận việc này).

Điều tôi thích làm là

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

sẽ lưu đầu ra, số dòng và '>>>' trước mỗi đầu vào (tùy chọn o, n và p). Xem các tài liệu cho% lịch sử ở đây .


1

có một lựa chọn khác --- pyslice. trong "trình diễn và công cụ wxpython 2.8 docs", có một chương trình nguồn mở có tên là "pyslices".

bạn có thể sử dụng nó như một trình soạn thảo, và nó cũng hỗ trợ sử dụng như một bàn điều khiển ---- thực thi từng dòng như một trình thông dịch tương tác với tiếng vang ngay lập tức.

tất nhiên, tất cả các khối mã và kết quả của mỗi khối sẽ được tự động ghi vào một tệp txt.

kết quả được ghi lại ngay sau khối mã tương ứng. rât thuận tiện.

tổng quan về pyslices


Tác giả PySlices ở đây. Vui mừng bạn thích PySlices (và thậm chí bạn đã tìm thấy nó). Nó chưa hoàn toàn từ bỏ kho (tôi thực sự vẫn sử dụng nó), nhưng phiên bản có trong wxPython thường không hoạt động tốt. Nếu bạn muốn theo dõi các bản cập nhật, bạn có thể lấy chúng từ gói wx_py : pypi.python.org/pypi/wx_py , github.com/davidmashburn/wx_py
David

1

Nếu bạn sử dụng bpython , tất cả lịch sử lệnh của bạn theo mặc định được lưu vào ~/.pythonhist.

Để lưu các lệnh cho lần tái sử dụng sau, bạn có thể sao chép chúng vào tệp script python:

$ cp ~/.pythonhist mycommands.py

Sau đó chỉnh sửa tệp đó để dọn sạch và đặt nó trong đường dẫn Python (gói trang web của môi trường toàn cầu hoặc ảo, thư mục hiện tại, đề cập trong * .pth hoặc một số cách khác).

Để bao gồm các lệnh vào shell của bạn, chỉ cần nhập chúng từ tệp đã lưu:

>>> from mycommands import *

cứu tinh. một câu trả lời khó tìm
Mehdi LAMRANI

0

Một số ý kiến ​​đã hỏi làm thế nào để lưu tất cả các đầu vào IPython cùng một lúc. Đối với% save ma thuật trong IPython, bạn có thể lưu tất cả các lệnh theo chương trình như bên dưới, để tránh thông báo kịp thời và cũng để tránh chỉ định các số đầu vào. currentLine = len (In) -1% lưu -f my_session 1- $ currentLine

Các -ftùy chọn được sử dụng để buộc thay thế tập tin và các len(IN)-1chương trình đầu vào hiện tại dấu nhắc trong IPython, cho phép bạn lưu toàn bộ phiên lập trình.


0

Đối với những người sử dụng spacemacsipythonđi kèm python-layer, lưu ma thuật tạo ra rất nhiều đầu ra không mong muốn, do lệnh tự động hoàn thành liên tục hoạt động ở backround như:

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)

Để tránh điều này, chỉ cần lưu bộ đệm ipython như bạn thường lưu bất kỳ bộ đệm nào khác: spc f s


0

Tôi muốn đề xuất một cách khác để duy trì phiên python thông qua tmux trên linux. bạn chạy tmux, đính kèm bản thân vào phiên bạn đã mở (nếu không được đính kèm sau khi mở trực tiếp). thực hiện python và làm bất cứ điều gì bạn đang làm trên nó. sau đó tách ra khỏi phiên. tách ra từ một phiên tmux không đóng phiên. phiên vẫn mở.

Ưu điểm của phương pháp này: bạn có thể đính kèm vào phiên này từ bất kỳ thiết bị nào khác (trong trường hợp bạn có thể ssh máy tính của mình)

Nhược điểm của phương thức này: phương thức này không từ bỏ các tài nguyên được sử dụng bởi phiên python đã mở cho đến khi bạn thực sự tồn tại trình thông dịch python.


0

Để lưu đầu vào và đầu ra trên XUbfox :

  1. Trong XWindows, chạy iPython từ ứng dụng đầu cuối Xfce
  2. nhấp vào Terminalthanh menu trên cùng và tìm kiếm save contentstrong danh sách thả xuống

Tôi thấy điều này sẽ lưu đầu vào và đầu ra, quay trở lại khi tôi mở thiết bị đầu cuối. Đây không phải là ipython cụ thể và sẽ hoạt động với các phiên ssh hoặc các tác vụ khác chạy từ cửa sổ terminal.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.