Как запустить пакет Python с PyPy2, который состоит только из файлов pyc? - PullRequest
3 голосов
/ 03 апреля 2019

Используя CPython2, я могу скомпилировать пакет с исходным кодом Python с помощью python.exe -c "import mypackage".После рекурсивного удаления всех файлов *.py я могу просто импортировать его с помощью import mypackage и использовать его как обычно.

Используя CPython3, я могу скомпилировать мой pycaage исходного кода Python с помощью python.exe -m compileall -b "full/path/to/mypackage".После рекурсивного удаления всех файлов *.py я могу просто импортировать его с помощью import mypackage.и используйте его как обычно.

Это можно сделать даже с использованием PyPy3 точно таким же образом.

Удивительно, но при использовании PyPy2 это не работает!

После компиляции и удаленияИсходные файлы я получаю следующий вывод:

Python 2.7.13 (9112c8071614, Feb 06 2019, 23:10:08)
[PyPy 7.0.0 with MSC v.1500 32 bit] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>> import mypackage
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named mypackage
>>>>

Есть ли обходной путь для этой проблемы?

Как я могу сказать PyPy2 просто посмотреть на *.pyc файлы, как CPython2?

Любой конструктивный вклад приветствуется!

1 Ответ

3 голосов
/ 03 апреля 2019

Как вы обнаружили, PyPy2 отказывается загружать одиночные .pyc файлы, то есть .pyc файлы, которые все еще существуют после того, как вы удалили файл .py.Вместо этого PyPy3 ведет себя как CPython.

Текущий статус PyPy2 отражает раздражение разработчиков PyPy этой деталью CPython.Во время разработки PyPy нас слишком часто игнорировали.С нашей точки зрения, когда вы обычно что-то разрабатываете, после удаления или переименования файла .py вы хотите увидеть сбой, если вы забыли исправить или избавиться от операторов импорта в других файлах.Вместо этого вы видите, что импорт все еще работает, и все тесты для этих несвязанных файлов по-прежнему проходят, потому что они все еще используют ту же старую логику.Итак, вы думаете, что все готово и проверяете файлы в системе контроля версий - но, конечно, это неправильно.

По этой причине мы рано решили, что такое поведение CPython больше похоже на ошибку длямы и не воспроизводили его по умолчанию в PyPy2.Если вам действительно нужно это поведение, вам нужно повторно перевести PyPy2, передав флаг --lonepycfile.

PyPy3 появился позже и поставляется с собственной системой importlib в чистом Python, которую мы не трогали.

...