2014-09-29 14 views
16

Có thể lưu một không gian làm việc IPython (các hàm được xác định, các loại biến khác nhau, v.v.) để có thể tải nó sau không?Lưu không gian làm việc trong IPython

Đây sẽ là một chức năng tương tự như save.image() trong MATLAB hoặc R. câu hỏi tương tự đã được hỏi trước, chẳng hạn như:

Save session in IPython like in MATLAB?

Tuy nhiên, vì một vài năm trôi qua, tôi tự hỏi nếu có một giải pháp tốt ngay bây giờ.

+1

Không, nhưng bạn có thể lưu tập hợp các biến. Có lẽ tốt hơn là làm ipythoning của bạn ở dạng sổ ghi chép, nơi kết quả, mã, hình ảnh và nhận xét tất cả đều trực tiếp. – mdurant

+1

nhìn ma thuật '% store' ma thuật – wim

+0

% có vẻ là một giải pháp có thể chấp nhận được. Ít nhất nó hoạt động cho mảng dữ liệu và gấu trúc DataFrame, phần lớn cấu trúc dữ liệu tôi sử dụng. Có cách nào để tự động hóa điều này trong máy tính xách tay ipython, tương tự như những gì Rstudio không? – qkhhly

Trả lời

-5

bạn chắc chắn có thể làm điều này trong máy tính xách tay ipython .

khi máy tính xách tay là lưu --either bằng tay hoặc bằng cấu hình mặc định - máy tính xách tay là vẫn kiên trì như một .ipynb tập tin, mà chỉ là một tập tinjson (một example trong một ý chính github).

Lần tiếp theo bạn khởi động máy chủ ipython trong thư mục chứa tệp đó, máy chủ sẽ phát hiện nó.

khi bạn mở sổ ghi chép đó trong trình duyệt, tất cả mã cấu hình & đều có nhưng chưa được thực hiện; bạn có thể thực thi mã trong mỗi ô bằng cách chọn thực hiện tất cả các ô từ menu ô. Ngoài ra, bạn cũng có thể lưu ảnh chụp nhanh sổ tay của mình theo cách thủ công, dưới dạng ipynb_checkpoints, được lưu trữ trong một thư mục có tên đó trước dấu chấm.

và cuối cùng, từ tập tin tùy chọn trình đơn, bạn có thể kiên trì máy tính xách tay của bạn như là một tập tin nguồn trăn tinh khiết (. py)

+1

Cảm ơn, nhưng điều này không chính xác những gì tôi muốn. Những gì tôi cần là để duy trì trạng thái của một phiên (tất cả các giá trị biến). Đó sẽ là một cái gì đó tương đương với hàm save.image() của R. – qkhhly

+0

@qkhhly đó là trong câu trả lời của tôi: câu áp chót, 'ipynb_checkpoints'; tải một tập tin trong thư mục này, sau đó thực thi mã trong các ô theo cách thủ công hoặc thông qua việc chọn 'thực hiện tất cả' từ 'Ô' trong thanh thực đơn). – doug

+7

@doug, việc thực thi mã (một lần nữa) có thể khá không thực tế, ví dụ:nó có thể mất nhiều giờ, vì vậy nó không phải luôn luôn là một giải pháp khả thi cho câu hỏi. – jolvi

7

EDIT: câu trả lời này (và gist) đã được sửa đổi để làm việc cho IPython 6

Tôi đã thêm một giải pháp đặc biệt tự động hóa quy trình lưu trữ/khôi phục biến không gian người dùng bằng mã cơ bản từ phép thuật cửa hàng% của IPython. d. Xem gist here. Lưu ý rằng điều này chỉ hoạt động đối với các đối tượng có thể được chọn.

Tôi không thể đảm bảo tính chắc chắn của nó, đặc biệt nếu bất kỳ cơ chế autorestore nào trong IPython thay đổi trong tương lai, nhưng nó đã làm việc cho tôi với IPython 2.1.0. Hy vọng rằng điều này sẽ ít nhất là điểm bạn đi đúng hướng.

Để nhắc lại các giải pháp ở đây:

  1. Thêm mã save_user_variables.py dưới đây để thư mục ipython của bạn (theo mặc định $ HOME/.ipython). Kịch bản này sẽ chăm sóc lưu các biến người dùng khi thoát.
  2. Thêm dòng này vào tập lệnh khởi động ipython của tiểu sử của bạn (ví dụ: $ HOME/.ipython/profile_default/startup/startup.py):

    get_ipython().ex("import save_user_variables;del save_user_variables")

  3. Trong ipython tập hồ sơ cấu hình của bạn (theo mặc định $ HOME/.ipython/profile_default/ipython_config.py) tìm dòng sau:

    # c.StoreMagics.autorestore = False

    Bỏ ghi chú nó và đặt nó thành sự thật. Điều này sẽ tự động tải lại các biến được lưu trữ khi khởi động. Hoặc bạn có thể tải lại phiên cuối cùng theo cách thủ công bằng cách sử dụng% store -r.

save_user_variables.py

def get_response(quest,default=None,opts=('y','n'),please=None,fmt=None): 
    try: 
     raw_input = input 
    except NameError: 
     pass 
    quest += " (" 
    quest += "/".join(['['+o+']' if o==default else o for o in opts]) 
    quest += "): " 

    if default is not None: opts = list(opts)+[''] 
    if please is None: please = quest 
    if fmt is None: fmt = lambda x: x 

    rin = input(quest) 
    while fmt(rin) not in opts: rin = input(please) 

    return default if default is not None and rin == '' else fmt(rin) 

def get_user_vars(): 
    """ 
    Get variables in user namespace (ripped directly from ipython namespace 
    magic code) 
    """ 
    import IPython 
    ip = IPython.get_ipython()  
    user_ns = ip.user_ns 
    user_ns_hidden = ip.user_ns_hidden 
    nonmatching = object() 
    var_hist = [ i for i in user_ns 
       if not i.startswith('_') \ 
       and (user_ns[i] is not user_ns_hidden.get(i, nonmatching)) ] 
    return var_hist 

def shutdown_logger(): 
    """ 
    Prompts for saving the current session during shutdown 
    """ 
    import IPython, pickle 
    var_hist = get_user_vars() 
    ip = IPython.get_ipython() 
    db = ip.db 

    # collect any variables that need to be deleted from db 
    keys = map(lambda x: x.split('/')[1], db.keys('autorestore/*')) 
    todel = set(keys).difference(ip.user_ns) 
    changed = [db[k] != ip.user_ns[k.split('/')[1]] 
       for k in db.keys('autorestore/*') if k.split('/')[1] in ip.user_ns] 

    try: 
     if len(var_hist) == 0 and len(todel) == 0 and not any(changed): return 
     if get_response("Save session?", 'n', fmt=str.lower) == 'n': return 
    except KeyboardInterrupt: 
     return 

    # Save interactive variables (ignore unsaveable ones) 
    for name in var_hist: 
     obj = ip.user_ns[name] 
     try: 
      db[ 'autorestore/' + name ] = obj 
     except pickle.PicklingError: 
      print("Could not store variable '%s'. Skipping..." % name) 
      del db[ 'autorestore/' + name ] 

    # Remove any previously stored variables that were deleted in this session 
    for k in todel: 
     del db['autorestore/'+k] 

import atexit 
atexit.register(shutdown_logger) 
del atexit 
+0

Có ai khác đã thử điều này trong Ipython 6 và Windows không? –

+0

nó didnt làm việc cho tôi .. có lẽ một cái gì đó đã thay đổi kể từ ipython 2.0 –

+1

này nên làm việc với python 3/ipython 6 bây giờ – toes

0

Bạn có thể thử

%save name lines 

Giống như nếu bạn có đầu vào 67 lệnh và bạn muốn lưu tất cả trong số họ:

%save myhistory 1-67 
+1

thực hiện điều này thực sự lưu trạng thái (tức là, các biến/đối tượng)? Sự hiểu biết của tôi là nó không. Nếu có, bạn có thể cung cấp một ví dụ không? Cảm ơn! –

+1

% lưu sẽ lưu lệnh lịch sử vào tệp .py. Sau đó, tôi có thể chạy tệp .py này bất kỳ lúc nào để khôi phục không gian làm việc. ' Trong [1]: s = 'bạn khỏe không?' Trong [2]: a = 123 Trong [3]:% tiết kiệm x 1-2 Các lệnh sau đây được viết vào tập tin 'x.py': s = 'how are you?' a = 123' – maoyang

+1

@maoyang điểm xấu là có thể mất nhiều thời gian để chạy lại các lệnh – Statham

0

Mặc dù không thuận tiện như save.image(), bạn có thể sử dụng một trong các ứng dụng trạm kiểm soát/khôi phục. Nếu bạn đang sử dụng Linux, bạn có thể thử http://criu.org. Tôi đang sử dụng nó theo thời gian để đổ trạng thái ipython của tôi và khôi phục sau này.

Để kết xuất ứng dụng shell với CRIU, bạn cần tìm PID (ví dụ: pstree -p) và sau đó sử dụng thứ gì đó như thế này (bạn sẽ cần thiết bị đầu cuối thứ hai cho điều này; CRIU không thể ngừng công việc đã dừng):

sudo criu dump -t PID --images-dir ~/tmp/imgs --log-file dump.log -v4 --shell-job 

điều này sẽ ghi tất cả ảnh cần thiết vào ~/tmp/imgs (nhớ tùy chọn --shell-job). Để khôi phục nhà nước sau đó để các thiết bị đầu cuối hiện nay (đừng quên nhấn Enter để tiếp theo ipython nhắc):

sudo criu restore --images-dir ~/tmp/imgs/ --log-file restore.log -v4 --shell-job 

Kiểm tra các bản ghi trong trường hợp bất kỳ vấn đề.

Rõ ràng CRIU sẽ hoạt động với bất kỳ ứng dụng nào (với một số giới hạn, tất nhiên). Nó chỉ là một ý tưởng để bạn có thể sử dụng nó cho ipython.

Các vấn đề liên quan