Я пытаюсь запустить приложение Python, не поддерживая исходные файлы .py
и полагаясь только на файлы .pyc
. Тем не менее, я получаю ошибки импорта, когда я удаляю исходные файлы .py
. Эта функциональность работает в Python 2.7, но не в 3.4 (с новой структурой __pycache__
).
Вот пример структуры каталогов:
package/ __init__.py module.py
Python 2.7
Сначала посмотрим, что произойдет, когда я использую Python 2.7 (это желаемое поведение)
$ python2 -c "from package import module"
$ find package -name "*.py" -delete
$ python2 -c "from package import module"
Все хорошо, и ошибок не возникает. Структура каталогов после этого будет выглядеть так: файлы .pyc
вдоль исходных файлов .py
:
package/ __init__.pyc module.pyc
Python 3.4
Теперь сделаем то же самое с Python 3.4, начиная с нашей исходной структуры каталога снова
$ python3 -c "from package import module"
$ find package -name "*.py" -delete
$ python3 -c "from package import module"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: cannot import name 'module'
Ух, он не может импортировать модуль. Интересно, что я все еще мог безопасно запустить python3 -c "import package"
на этом этапе, но он не может захватить какие-либо модули оттуда. На данный момент структура каталогов выглядит немного иначе, чем в версии 2.7, в частности:
package/ __pycache__/ __init__.cpython-34.pyc module.cpython-34.pyc
Итак, вопрос заключается в следующем: почему Python 3.4 не может импортировать/выполнять правильно только для файлов .pyc
? Является ли это желательным поведением, а это значит, что источник должен поддерживаться во всех ситуациях? Или мне не хватает чего-то глупого?