2016-04-07 4 views
0

У меня есть основной файл, который импортирует класс из другого файла, как например:модуль Python Обновление

from pybrain.rl.environments.HoldemTask import HoldemTask. 

При изменении HoldemTask.py, изменения не отражаются в главном файле. Единственным обходным решением, которое я нашел, является запуск Pybrain's

python setup.py install 

Могу ли я перезагрузить модуль или что-то еще? Перезагрузка(), похоже, не работает.

ответ

1

Во-первых: python setup.py install обычно делает копию кода его установка, поэтому, если вы обнаружили, что вам нужно запустить что, прежде чем изменения вступят в силу, есть вероятность, что для развития вы должны регулировать ваш PYTHONPATH или sys.path так что ваш соответствующий импорт поступает непосредственно из исходного дерева, а не из библиотеки пакетов сайтов Python. Вы можете быстро проверить, какой файл код импортирует, помещая это в верхней части основного файла при запуске:

from pybrain.rl.environments import HoldemTask # module object, not class 
print(HoldemTask.__file__) 

Во-вторых, в целом гораздо лучше, чтобы перезапустить процесс Python при внесении изменений кода в чтобы они вступили в силу. Если вам действительно нужно, чтобы изменения отображались без перезагрузки, читайте дальше.

Перезагрузка модуля на Python влияет только на будущий импорт. Для перезагрузки для работы в процессе вам необходимо заменить импортированный объект класса после перезагрузки. Например, в контексте «главного файла» исполняющей импорта вы перечислили (внутри метода класса или функции отлично):

# we need a module object to reload(), not the class inside it 
from import pybrain.rl.environments import HoldemTask as HoldemTask_module 
reload(HoldemTask_module) 
# we then need to replace the old class object with the reloaded one 
# in the main file's module-wide (aka "global") namespace 
global HoldemTask 
HoldemTask = HoldemTask_module.HoldemTask 

Один последний нюанс в том, что любые существующие HoldemTask объекты будут продолжать использовать старый код, потому что они встроят в себя ссылку на объект класса до перезагрузки. Единственный способ для завершения перезагрузки в процессе - это, если код специально написан, чтобы выбросить каждый экземпляр всего, что он сделал на основе исходного модуля.

+0

Спасибо! Я просто изменил свой PYTHONPATH и поместил файлы в новую папку. –