Bagaimana cara menyimpan semua variabel di sesi python saat ini?

96

Saya ingin menyimpan semua variabel di lingkungan python saya saat ini. Tampaknya salah satu pilihan adalah menggunakan modul 'acar'. Namun, saya tidak ingin melakukan ini karena 2 alasan:

  1. Saya harus memanggil pickle.dump()setiap variabel
  2. Ketika saya ingin mengambil variabel, saya harus mengingat urutan penyimpanan variabel, dan kemudian melakukan a pickle.load()untuk mengambil setiap variabel.

Saya mencari beberapa perintah yang akan menyimpan seluruh sesi, sehingga ketika saya memuat sesi yang disimpan ini, semua variabel saya dipulihkan. Apakah ini mungkin?

Sunting: Saya kira saya tidak keberatan memanggil pickle.dump()setiap variabel yang ingin saya simpan, tetapi mengingat urutan yang tepat di mana variabel disimpan tampaknya seperti batasan besar. Saya ingin menghindari itu.

pengguna10
sumber

Jawaban:

84

Jika Anda menggunakan rak , Anda tidak perlu mengingat urutan pengambilan objek, karena shelvememberi Anda objek seperti kamus:

Untuk menunda pekerjaan Anda:

import shelve

T='Hiya'
val=[1,2,3]

filename='/tmp/shelve.out'
my_shelf = shelve.open(filename,'n') # 'n' for new

for key in dir():
    try:
        my_shelf[key] = globals()[key]
    except TypeError:
        #
        # __builtins__, my_shelf, and imported modules can not be shelved.
        #
        print('ERROR shelving: {0}'.format(key))
my_shelf.close()

Untuk memulihkan:

my_shelf = shelve.open(filename)
for key in my_shelf:
    globals()[key]=my_shelf[key]
my_shelf.close()

print(T)
# Hiya
print(val)
# [1, 2, 3]
unutbu
sumber
4
Sempurna. Inilah yang saya cari. BTW, saya menemukan kalimat ini di posting Anda sangat lucu: "Untuk menunda pekerjaan Anda" :)
user10
3
Dan di sini saya pikir "acar" itu lucu! :) en.wikipedia.org/wiki/Inherently_funny_word
unutbu
1
Saya tahu jawaban ini sangat lama ketika saya melakukan ini, saya memiliki kesalahan berikut: PicklingError: Can't pickle <built-in function raw_input>: it's not the same object as __builtin__.raw_inputSaya hanya memiliki 2 variabel yang dideklarasikan di ruang kerja saya. Ada ide tentang cara mengatasi ini? Adakah cara yang lebih baik untuk menyimpan sesi saat ini setelah jawaban ini?
Hellter
1
Saya memiliki masalah yang sama terkait penggunaan rak seperti yang dijelaskan di atas. PicklingError: Can't pickle <type 'numpy.int32'>: ini bukan objek yang sama dengan numpy.int32
Pu Zhang
1
Sepertinya beberapa fungsi dan paket bawaan tidak dapat disimpan, jadi gunakan except:saja except TypeError:. Ini akan menyimpan variabel yang ditentukan pengguna dan sebagian besar objek (bingkai data panda disimpan dengan baik untuk saya)
Nitro
65

Setelah duduk di sini dan gagal menyimpan globals()sebagai kamus, saya menemukan Anda dapat membuat sesi acar menggunakan perpustakaan dill.

Ini dapat dilakukan dengan menggunakan:

import dill                            #pip install dill --user
filename = 'globalsave.pkl'
dill.dump_session(filename)

# and to load the session again:
dill.load_session(filename)
pengguna2589273
sumber
Saya tidak berpikir dill menyimpan semua variabel, misalnya jika Anda menjalankan dill.dump_session () di variabel fungsi yang bersifat lokal ke fungsi itu tidak disimpan.
Parsa
3
Itu hanya masalah cakupan, saya kira Anda bisa menambahkan semua penduduk lokal Anda () ke global () jika Anda harus?
pengguna2589273
Saya mendapat "TypeError: tidak bisa membuat acar objek Socket"
R. Cox
1
Saya mendapatkan jenis kesalahan berikut saat membuang sesi: TypeError: no default __reduce__ due to non-trivial __cinit__
Kareem Jeiroudi
Saya mencoba ini dan menemukan itu tidak dapat menyimpan array bernama meskipun ini mungkin batasan acar.
rhody
6

Salah satu cara yang sangat mudah yang dapat memuaskan kebutuhan Anda. Bagi saya, itu cukup berhasil:

Cukup, klik ikon ini di Variable Explorer (sisi kanan Spider):

Menyimpan semua variabel dalam format * .spydata

Memuat semua variabel atau foto, dll.

shm2008
sumber
Saya menyimpan semua variabel dalam format .spydata kemarin dan saya mencoba mengimpor data hari ini. Tidak ada variabel yang diimpor :(
Bharat Ram Ammu
Ini berfungsi untuk saya tetapi sekarang saya memiliki lebih banyak data, daripada membuat file Spydata, sekarang membuat file acar dengan konten nol serta ratusan file npy. Bagaimana cara saya membukanya?
R. Cox
4

Berikut adalah cara menyimpan variabel ruang kerja Spyder menggunakan fungsi spyderlib

#%%  Load data from .spydata file
from spyderlib.utils.iofuncs import load_dictionary

globals().update(load_dictionary(fpath)[0])
data = load_dictionary(fpath)



#%% Save data to .spydata file
from spyderlib.utils.iofuncs import save_dictionary
def variablesfilter(d):
    from spyderlib.widgets.dicteditorutils import globalsfilter
    from spyderlib.plugins.variableexplorer import VariableExplorer
    from spyderlib.baseconfig import get_conf_path, get_supported_types

    data = globals()
    settings = VariableExplorer.get_settings()

    get_supported_types()
    data = globalsfilter(data,                   
                         check_all=True,
                         filters=tuple(get_supported_types()['picklable']),
                         exclude_private=settings['exclude_private'],
                         exclude_uppercase=settings['exclude_uppercase'],
                         exclude_capitalized=settings['exclude_capitalized'],
                         exclude_unsupported=settings['exclude_unsupported'],
                         excluded_names=settings['excluded_names']+['settings','In'])
    return data

def saveglobals(filename):
    data = globalsfiltered()
    save_dictionary(data,filename)


#%%

savepath = 'test.spydata'

saveglobals(savepath) 

Beri tahu saya jika ini berhasil untuk Anda. David BH

David BH
sumber
"NameError: nama 'fpath' tidak ditentukan": apakah saya lupa sesuatu?
Thomas
Itu ide yang bagus. Saya berpikir untuk meminjam dari ruang kerja spyder untuk hal yang sama. Tapi tidak tahu caranya. Namun, saya tidak begitu memahami kode Anda. Bisakah Anda jelaskan, apakah ini bekerja persis seperti Spyder yang secara otomatis menangkap semua variabel, atau saya harus menentukan variabel yang ingin saya gunakan?
cqcn1991
2

Apa yang Anda coba lakukan adalah menghentikan proses Anda. Ini sudah dibahas . Kesimpulannya adalah bahwa ada beberapa masalah yang sulit dipecahkan saat mencoba melakukannya. Misalnya dengan memulihkan deskriptor file yang terbuka.

Lebih baik memikirkan subsistem serialisasi / deserialisasi untuk program Anda. Ini tidak sepele dalam banyak kasus, tetapi merupakan solusi yang jauh lebih baik dalam perspektif jangka panjang.

Meski jika saya sudah membesar-besarkan masalahnya. Anda dapat mencoba untuk acar variabel global Anda dict . Gunakan globals()untuk mengakses kamus. Karena ini diindeks varname, Anda tidak perlu repot tentang pesanan.

nkrkv
sumber
Tidak. Saya tidak mencoba menghentikan prosesnya. Saya memiliki shell python interaktif tempat saya menjalankan beberapa skrip dan perintah. Saya ingin menyimpan output (variabel) dari beberapa perintah ini, sehingga di masa mendatang setiap kali saya membutuhkan akses ke output, saya dapat menjalankan shell python dan memuat semua variabel ini.
pengguna10
Jadi, acar kamus var_name -> var_value
nkrkv
0

Jika Anda ingin jawaban yang diterima disarikan berfungsi, Anda dapat menggunakan:

    import shelve

    def save_workspace(filename, names_of_spaces_to_save, dict_of_values_to_save):
    '''
        filename = location to save workspace.
        names_of_spaces_to_save = use dir() from parent to save all variables in previous scope.
            -dir() = return the list of names in the current local scope
        dict_of_values_to_save = use globals() or locals() to save all variables.
            -globals() = Return a dictionary representing the current global symbol table.
            This is always the dictionary of the current module (inside a function or method,
            this is the module where it is defined, not the module from which it is called).
            -locals() = Update and return a dictionary representing the current local symbol table.
            Free variables are returned by locals() when it is called in function blocks, but not in class blocks.

        Example of globals and dir():
            >>> x = 3 #note variable value and name bellow
            >>> globals()
            {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'x': 3, '__doc__': None, '__package__': None}
            >>> dir()
            ['__builtins__', '__doc__', '__name__', '__package__', 'x']
    '''
    print 'save_workspace'
    print 'C_hat_bests' in names_of_spaces_to_save
    print dict_of_values_to_save
    my_shelf = shelve.open(filename,'n') # 'n' for new
    for key in names_of_spaces_to_save:
        try:
            my_shelf[key] = dict_of_values_to_save[key]
        except TypeError:
            #
            # __builtins__, my_shelf, and imported modules can not be shelved.
            #
            #print('ERROR shelving: {0}'.format(key))
            pass
    my_shelf.close()

    def load_workspace(filename, parent_globals):
        '''
            filename = location to load workspace.
            parent_globals use globals() to load the workspace saved in filename to current scope.
        '''
        my_shelf = shelve.open(filename)
        for key in my_shelf:
            parent_globals[key]=my_shelf[key]
        my_shelf.close()

an example script of using this:
import my_pkg as mp

x = 3

mp.save_workspace('a', dir(), globals())

untuk mendapatkan / memuat ruang kerja:

import my_pkg as mp

x=1

mp.load_workspace('a', globals())

print x #print 3 for me

itu berhasil ketika saya menjalankannya. Saya akui saya tidak mengerti dir()dan globals()100% jadi saya tidak yakin apakah mungkin ada peringatan aneh, tetapi sejauh ini tampaknya berhasil. Komentar diterima :)


setelah beberapa penelitian lebih lanjut jika Anda memanggil save_workspaceseperti yang saya sarankan dengan global dan save_workspacedalam fungsi itu tidak akan berfungsi seperti yang diharapkan jika Anda ingin menyimpan veriables dalam lingkup lokal. Untuk penggunaan itu locals(). Ini terjadi karena global mengambil global dari modul tempat fungsi didefinisikan, bukan dari tempat dipanggilnya akan menjadi tebakan saya.

Pinokio
sumber
0

Anda dapat menyimpannya sebagai file teks atau file CVS. Orang-orang menggunakan Spyder misalnya untuk menyimpan variabel tetapi memiliki masalah yang diketahui: untuk tipe data tertentu ia gagal untuk diimpor di jalan.

Navid Farhoudi
sumber