Развертывание Python 2.x и 3.x без исходного кода .pyc - PullRequest
2 голосов
/ 12 июня 2019

В Python 2.x файлы .pyc хранятся в том же каталоге, что и исходный файл .py.В Python 3.2+ файлы .pyc хранятся в каталоге __pycache__.

Если код написан правильно, он может выполняться обоими интерпретаторами, и файлы .pyc могут нормально сосуществовать.Но как только я хочу избавиться от исходного кода, у меня возникает проблема: интерпретатор Python 2.x по-прежнему импортирует правильный файл .pyc, но интерпретатор Python 3.2+ отказывается импортировать скомпилированный .pyc из __pycache__ каталог и пытается импортировать файл .pyc из предыдущей версии и завершается неудачей, поскольку магические числа не совпадают.

Возможно ли сделать оба интерпретатора Python счастливыми, не раскрывая исходный код?

[Обновлено]

Я пробовал это (это выглядело как решение):

  1. Развертывание источников как обычно
  2. Компиляция каждого.Py-файл с компилятором Python 2.x (это приведет к созданию .pyc файла в том же каталоге)
  3. Компиляция каждого .py-файла с помощью компилятора Python 3.2+ (это приведет к созданию .pyc файла в __pycache__каталог)
  4. Очистить содержимое файла .py, сохранив дату его изменения

Интерпретатор Python 2 доволен.Интерпретатор Python 3 подозревает, что источник изменен, и перекомпилирует измененный источник.В чем причина его перекомпиляции?Сохраняет ли он также размер исходного файла?Контрольная сумма?

1 Ответ

2 голосов
/ 12 июня 2019

Python 3 будет использовать файлы .pyc в том же месте, если нет каталога .py или __pycache__.Обратите внимание, что Python 3 явно отказывается загружать __pycache__ файлы, если в исходном файле отсутствует , для дистрибутивов без исходного кода поддерживаются только устаревшие местоположения .

Модуль compileall и команда могут указывать на создание файлов .pyc в одном каталоге по той же самой причине:

python -m compileall -b

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

Так что нет, вы не можете иметь .pyc дистрибутивов без исходного кода, которые работают нанесколько версий Python.Этого никогда не было до Python 3.2, файлы Python 2.6, 2.7, 3.0 и 3.1 .pyc bytecache имеют уникальный номер версии bytecache, на «магическое число» Python пожалуется, если вы предоставите ему файл .pycиз другой версии.

...