Почему вы заставляете ваше приложение изменять свои собственные файлы?Это не только невероятно зло, метапрограммирование на порядок сложнее понять при отладке.Кроме того, Python кэширует импортируемые им модули, поэтому перезагрузить его не так-то просто.И, наконец, что не менее важно, вам не нужно записывать код в файл, чтобы выполнить его, если вы действительно должны выполнить динамически сгенерированный код.
Чтобы ответить на ваш вопрос о записи файлов в поточно-ориентированном видеобщее соглашение таково:
- Запись содержимого во временный файл в той же файловой системе, что и целевой файл.
- Переименование этого временного файла в целевой файл, перезаписывая его впроцесс.
Это работает, потому что переименование является атомарным в системах POSIX, когда выполняется на том же устройстве.Таким образом, в других потоках / процессах либо будет по-прежнему открыт старый файл, который теперь отсоединен от файловой системы и будет удален, как только эти потоки / процессы будут завершены, либо они откроют новый файл со всем его содержимым.Вы избегаете иметь файл, который наполовину записан.
На практике мне нравится создавать временный каталог с модулем tempfile в python, и записывать туда файл, затем перемещать его и удалять каталог - этоспособ создания файла с использованием umask по умолчанию.
И последнее, но не менее важное: переименование не является на самом деле атомарным в Windows, по крайней мере с настройками по умолчанию, поскольку оно не позволит вам перезаписать старый файл - вам нужносделать два переименования, и это вводит возможность состояния гонки.Я не знаю хорошего решения для Windows.