Подтвердить что ты не робот

Обновление/перезагрузка python

Это очень простой вопрос, но я не смог найти ответ, выполнив поиск в Интернете.

Я использую python для управления ArcGIS, и у меня есть простой python script, который вызывает некоторый предварительно написанный код.

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

Я даже переместил файл, который он вызывает в другое место, и script все еще работает нормально. Одна вещь, которую я делал вчера, я добавил папку, в которой все мои файлы python относятся к пути sys (используя sys.append( "путь" )), и мне интересно, не изменилось ли это.

Спасибо заранее, и извините за неаккуратную терминологию.

4b9b3361

Ответ 1

Непонятно, что вы имеете в виду под "обновлением", но нормальное поведение Python заключается в том, что вам необходимо перезапустить программное обеспечение, чтобы он мог взглянуть на новый модуль Python и перечитать его.

Если ваши изменения не позаботятся даже после перезагрузки, это связано с одной из двух ошибок:

  • Временная метка в pyc файле неверна и некоторое время в будущем.
  • Фактически вы редактируете неправильный файл.

Вы можете перезагрузить повторно прочитанный файл даже без перезапуска программного обеспечения с помощью команды reload(). Обратите внимание, что любая переменная, указывающая на что-либо в модуле, должна получить реимпорт после перезагрузки. Что-то вроде этого:

import themodule
from themodule import AClass

reload(themodule)
from themodule import AClass

Ответ 2

Один из способов сделать это - вызвать reload.

Пример: Вот содержимое foo.py:

def bar():
    return 1

В интерактивном сеансе я могу сделать:

>>> import foo
>>> foo.bar()
1

Затем в другом окне я могу изменить foo.py на:

def bar():
    return "Hello"

В интерактивном сеансе вызов foo.bar() по-прежнему возвращает 1, пока не сделаю следующее:

>>> reload(foo)
<module 'foo' from 'foo.py'>
>>> foo.bar()
'Hello'

Вызов reload - это один из способов убедиться, что ваш модуль обновлен, даже если файл на диске изменился. Это не обязательно самое эффективное (вам может быть лучше проверить последнее время модификации файла или использовать что-то вроде pyinotify перед тем, как вы reload), но это, безусловно, быстро реализовать.

Одна из причин, по которым Python не читает исходный модуль каждый раз, заключается в том, что загрузка модуля (относительно) дорогая - что, если у вас есть модуль 300 КБ, и вы использовали только одну константу из файла? Python загружает модуль один раз и сохраняет его в памяти, пока вы не reload его.

Ответ 3

Я использовал следующее при импорте всех объектов из модуля, чтобы убедиться, что web2py использует мой текущий код:

import buttons
import table
reload(buttons)
reload(table)
from buttons import *
from table import *

Ответ 4

Я не уверен, что это то, что вы имеете в виду, поэтому не стесняйтесь меня исправлять. Вы импортируете модуль - позвольте мне его mymodule.py - в вашей программе, но когда вы меняете его содержимое, вы не видите разницы?

Python не будет искать изменения в mymodule.py каждый раз, когда он будет использоваться, он будет загружать его в первый раз, скомпилировать его в байт-код и сохранить его внутри. Обычно он также сохраняет скомпилированный байт-код (mymodule.pyc). В следующий раз, когда вы запустите свою программу, он проверяет, является ли mymodule.py более поздним, чем mymodule.pyc, и при необходимости перекомпилируйте его.

Если вам нужно, вы можете явно перезагрузить модуль:

import mymodule

[... some code ...]

if userAskedForRefresh:
    reload(mymodule)

Конечно, это сложнее, и у вас могут быть побочные эффекты в зависимости от того, что вы делаете с вашей программой относительно другого модуля, например, если переменные зависят от классов, определенных в mymodule.

В качестве альтернативы вы можете использовать функцию execfile (или exec(), eval(), compile())

Ответ 5

Если вы работаете в оболочке IPython, есть несколько магических команд, которые существуют.

Документы IPython охватывают эту функцию, называемую расширение автозагрузки.

Первоначально я нашел это решение из публикации блога Джонатана Марта по этому самому вопросу (см. пункт 3 из этой ссылки).

В основном все, что вам нужно сделать, это следующее, и внесенные вами изменения автоматически отражаются после сохранения:

In [1]: %load_ext autoreload

In [2]: %autoreload 2

In [3]: Import MODULE

In [4]: my_class = Module.class()
        my_class.printham()
Out[4]: ham

In [5]: #make changes to printham and save
In [6]: my_class.printham() 
Out[6]: hamlet

Ответ 6

У меня была такая же проблема, создавая геообработку script для ArcGIS 10.2. У меня была панель инструментов python script, инструмент script, а затем общий script. У меня есть параметр для Dev/Test/Prod в инструменте, который будет управлять версией кода. Dev будет запускать код в папке dev, проверять тестовую папку и prod из папки prod. Изменения в общем dev script не будут выполняться при запуске инструмента из ArcCatalog. Закрытие ArcCatalog не имело никакого значения. Несмотря на то, что я выбрал Dev или Test, он всегда будет запускаться из папки prod.

Добавление перезагрузки (myCommonModule) в инструмент script разрешило эту проблему.