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:
- Saya harus memanggil
pickle.dump()
setiap variabel - 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.
PicklingError: Can't pickle <built-in function raw_input>: it's not the same object as __builtin__.raw_input
Saya 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?except:
sajaexcept TypeError:
. Ini akan menyimpan variabel yang ditentukan pengguna dan sebagian besar objek (bingkai data panda disimpan dengan baik untuk saya)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)
sumber
TypeError: no default __reduce__ due to non-trivial __cinit__
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.
sumber
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
sumber
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.sumber
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()
danglobals()
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_workspace
seperti yang saya sarankan dengan global dansave_workspace
dalam fungsi itu tidak akan berfungsi seperti yang diharapkan jika Anda ingin menyimpan veriables dalam lingkup lokal. Untuk penggunaan itulocals()
. Ini terjadi karena global mengambil global dari modul tempat fungsi didefinisikan, bukan dari tempat dipanggilnya akan menjadi tebakan saya.sumber
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.
sumber