Почему мои файлы jython "* $ py.class" не обновляются с изменениями кода после того, как я переместил их в другой пакет? - PullRequest
9 голосов
/ 24 августа 2011

Изначально все мои модули были в одной упаковке.Недавно я создал подпакет в исходном пакете и переместил в него несколько модулей.Моя папка src и две папки с пакетами находятся в моей папке PYTHONPATH.

С тех пор, как я переместил эти модули, изменения, которые я вносил в их файлы .py, похоже, не попадают всгенерированные файлы * $ py.class, которые, как мне кажется, в конечном итоге и запускаются, исходя из того, что print __FILE__ выплевывает.

Файлы .class находятся в каталоге пакета верхнего уровня, который, я считаю,потому что первое место, из которого они импортируются, находится в модуле, который находится в этом пакете.Так что я думаю, что они находятся в правильном месте.

Перемещение модулей обратно в пакет верхнего уровня действительно устраняет проблему, но вряд ли нужно иметь все модули в одном пакете.Есть ли что-то, что я должен сделать, чтобы «зарегистрировать» модуль как часть пакета, кроме того, чтобы поместить его в папку с __init__.py?

Примечание: остальная часть этого вопроса простосимптомы, которые заставили меня сделать вывод, что файлы .class не обновляются, когда я изменяю файлы .py.Вы, вероятно, можете пропустить это, если вы тип tl; dr человек: P

Я помещаю кучу пробелов в начале функции, и когда я прохожу через нее, курсор следуетгде код был.

Вот код, который мне показывает IDE:

enter image description here

и вот локальные переменные (обратите внимание, что self имеетничто не ограничено):

enter image description here

После того, как я шагну пару строк, вот код (обратите внимание на положение курсора): enter image description here и локальные:

enter image description here

Обратите внимание, что теперь self имеет ограничения id и updatePeriod, поэтому первые две строки кода после пробела были явно выполнены.

Если яполностью удалите файл .py (прикрепите его на рабочий стол или что-то в этом роде), тогда, очевидно, среда IDE не сможет его найти, поэтому я не могу пройти по нему, но программа запускается в зависимости от того, какой код был (есть некоторыеочевидные изменения, о которых я могу сказать, не действуют).

Наконец, даты изменения соответствующих файлов * $ py.class aему около 4,5 часов, несмотря на все то, что я делал с последними файлами .py в течение последнего часа или 2.

Ответы [ 3 ]

4 голосов
/ 30 августа 2011

Скомпилированные файлы Python не удаляются автоматически при удалении .py.Так как они находятся в $PYTHONPATH перед вашими подпакетами, они выполняются, и поскольку им не соответствует .py, они привыкнут и никогда не будут обновляться.Единственное решение - удалить их вручную.

PyDev, по-видимому, добавляет путаницы, фактически интерпретируя источник.

1 голос
/ 22 апреля 2015

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

Файлы $py.class создаются и обновляются только тогда, когда .py class импортируется куда-либо.Если файл .py выполняется с execfile(), то файл $py.class не создается и не обновляется.

1 голос
/ 30 августа 2011

Я думаю, что здесь есть 2 проблемы:

  • Когда вы перемещаете файл, $py.class не восстанавливается:

Это, вероятно, потому что вызапуск файла в качестве основной записи ... Если я правильно помню, $py.class генерируется только тогда, когда файл импортируется (то есть: не для вашего __main__ модуля), и только если код действительно был изменен (I 'я не уверен, как Jython решает, что он был изменен - ​​возможно, время файла, но я могу ошибаться здесь).

Лучшее решение для этого будет удаление $ py.class при перемещении файлаи соответствующий ему $ py.class (например, перемещение папки), так что вы можете быть на 100% уверены, что Jython никогда не поднимет его.

PyDev может вам помочь: выберите папку в файлах PyDev Package Explorer > PyDev > Remove *.pyc, *.pyo and *$py.class Files.

  • $py.class без соответствующего файла .py

PyDevфактически обрабатывает это правильно для файлов .pyc (то есть: удаляет .pyc, когда файл .py больше не доступен).Я изменяю PyDev, чтобы обрабатывать это и для $py.class файлов (поэтому, если вы получаете ночной в течение 3-4 часов, он должен работать - см. http://pydev.org/download.html инструкции для его получения - дозатем вы можете выполнить удаление вручную, как описано выше).

...