2016-10-08 14 views
0

Чтобы позволить мне иметь ясную структуру в моем проекте, я использую следующий фрагмент кода для динамического добавления основной папки проекта в PYTHONPATH и, следовательно, гарантирую, что я могу импортировать файлы даже сверху расположение файлов.Динамическое обновление PYTHONPATH предотвращает обновление .pyc

import sys 
import os 
sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), ".")) 

Так как я сделал это, когда я начинаю свой основной файл, изменения в модулях не распознаются больше, пока я вручную удалить любые .pyc файлы. Таким образом, я предполагаю, что это почему-то помешало python проверить, обновлены ли файлы pyc. Могу ли я преодолеть эту проблему?

ответ

1

Вы можете попробовать сделать питон не писать эти * .pyc-файлы.

How to avoid .pyc files?

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

+0

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

+0

'sys.modules' содержит модули, которые были загружены интерпретатором. Если вы модифицируете PYTHONPATH, а некоторые новые модули переопределит то, что уже было там, то новые изменения не будут видны - возможно. Вы все равно не должны использовать магию. Просто установите PYTHONPATH как можно выше в иерархии файлов и сделайте это. Кроме того, вы должны использовать virtualenv для установки как вашего проекта, так и других зависимостей, а также точек установки setup.py для более сложных вещей. У вас есть проект, который вырос из простого сценария, и вы никогда не реорганизовали его? –

1

Добавление пути уже импортированного модуля может вызвать у вас проблемы, если имена модулей больше не уникальны. Учтите, что вы делаете import foo, который добавляет свой родительский пакет bar в sys.path - теперь можно сделать также import bar.foo. Python будет рассматривать как разные модули, которые могут испортить все, что зависит от идентичности модуля.

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

cd bardir/bar 
python foo 

, но вместо того, чтобы назвать его как часть пакета через

cd bardir 
python -m bar.foo