Я оцениваю укроп, и я хочу знать, обрабатывается ли этот сценарий. У меня есть случай, когда я успешно импортирую модуль в процесс python. Могу ли я использовать укроп для сериализации, а затем загружать этот модуль в другой процесс с другим sys.path, который не включает этот модуль? Прямо сейчас я получаю неудачи импорта, но, возможно, я делаю что-то неправильно.Выполняет ли модуль python укропа при импорте модулей, когда sys.path отличается?
Вот пример. Я запустить этот сценарий, где путь модуля foo.py находится в моем sys.path:
% cat dill_dump.py
import dill
import foo
myFile = "./foo.pkl"
fh = open(myFile, 'wb')
dill.dump(foo, fh)
Теперь я бегу этот сценарий, где у меня нет каталога foo.py в моем PYTHONPATH:
% cat dill_load.py
import dill
myFile = "./foo.pkl"
fh = open(myFile, 'rb')
foo = dill.load(fh)
print foo
Она терпит неудачу с этой трассировки стека:
Traceback (most recent call last):
File "dill_load.py", line 4, in <module>
foo = dill.load(fh)
File "/home/b/lib/python/dill-0.2.4-py2.6.egg/dill/dill.py", line 199, in load
obj = pik.load()
File "/rel/lang/python/2.6.4-8/lib/python2.6/pickle.py", line 858, in load
dispatch[key](self)
File "/rel/lang/python/2.6.4-8/lib/python2.6/pickle.py", line 1133, in load_reduce
value = func(*args)
File "/home/b/lib/python/dill-0.2.4-py2.6.egg/dill/dill.py", line 678, in _import_module
return __import__(import_name)
ImportError: No module named foo
Так что, если мне нужно иметь один и тот же путь питона между двумя процессами, то какой смысл сериализации модуль питона? Или, другими словами, есть ли какое-либо преимущество в загрузке foo через укроп, только имея вызов «import foo»?
Одно из предложений о том, как реализовать это, - это захват sys.path в сериализованном потоке данных, чтобы вы знали, где при загрузке появился модуль _foo_. Это было бы полезно в том, что это позволило бы увеличить переносимость состояния python, где вы могли бы загрузить сеанс python на машинах или оболочках с разными настройками. –
@BrentV: Хорошая идея. Эта информация действительно должна быть в атрибуте '__file__'. Итак, 'foo .__ file__' скажет вам, откуда он был загружен. Это можно было бы использовать только на том же компьютере, конечно, так что это не полностью портативное решение. Я шел по линиям захвата всего кода модуля с помощью 'inspect' или' dill.source.getsource'. –