Как правило, .pyc
файлы относятся к одной версии Python (хотя переносимы на разные архитектуры компьютеров, если они работают с одной и той же версией); файлы содержат информацию о соответствующей версии Python в своих заголовках - поэтому, если вы оставите соответствующие .py
файлы рядом с .pyc
, .pyc
будет перестраиваться при каждом использовании другой версии Python для импортировать эти модули. «Попытка запустить» файлы неправильной версии .pyc
- это то, о чем я никогда не слышал. Какие архитектуры были задействованы? Были ли файлы .py
такими, какими они должны быть?
Редактировать : как ОП пояснил, что сбой произошел, когда он запускал программы Python 2.4 и Python 2.5 на одних и тех же файлах .py
(с двух разных серверов, общий доступ сетевой диск), объяснение сбоев становится легким. Файлы .py
все время перекомпилировались - в Python 2.4, когда 2.5 запускал их совсем недавно, и наоборот - и поэтому файлы .pyc
были неистово заняты перезаписью все время. Общеизвестно, что добиться правильной блокировки файлов на сетевых дисках (особенно, но не исключительно в разных операционных системах). Таким образом, должно было произойти следующее (роли могли быть изменены): сервер 2.4 только что определил, что файл .pyc
подходит для него, и начал его читать; прежде чем он смог закончить чтение, сервер 2.5 (предварительно определив, что модуль необходимо перекомпилировать) записал поверх него; таким образом, у сервера 2.4 был буфер памяти, который имел (скажем) первые 4 КБ байта из версии 2.4 и следующие 4 КБ из версии 2.5. Тогда использовал этот искаженный буфер, что неудивительно ... крах !!!
Это может быть реальной проблемой, если вы постоянно пытаетесь запустить один набор .py
файлов из двух или более разных версий Python (даже на одном и том же сервере, без дополнительных сложностей сетевых дисков). «Правильным» решением будет что-то вроде virtualenv . Хак (простой, но грязный), который мы взяли на работу (много лет назад, но он все еще находится в разработке ...!), Заключается в исправлении каждой версии Python для создания и использования различных расширений для своих скомпилированных файлов байт-кода: .pyc
(или .pyo
) для Python 1.5.2
(который был самой стабильной "системной" версией, когда мы начали делать этот кладж для более новых версий), .pyc-2.0
для 2.0, .pyc-2.2
для 2.2 и т. Д. (или эквивалент .pyo-X.Y
конечно). Я слышал, что это скоро уйдет (спасибо Томасу!), Но на протяжении многих лет мы прилично преодолевали эту щекотливую проблему.
Гораздо более простое решение - сохранить одну версию Python, если это возможно для вашей системы; если в вашей системе есть какие-либо сложности, из-за которых невозможно иметь одну версию Python (как у нас, и у нас), то в эти дни я от всей души рекомендую virtualenv
, о котором я уже упоминал.
С принятием PEP 3147 в Python 3.2 файлы pyc для разных версий Python автоматически различаются по имени файла. Это должно решить большинство проблем с разными версиями Python, перезаписывающими файлы pyc друг друга.