Python не обнаруживает.pyc файлы
Я использую Python 3.2 (как для сборки, так и для выполнения), и вот мой вопрос.
Я намерен отправить свое приложение на Python со следующей настройкой:
Есть основной сценарий (скажем, Main.py
), который использует скомпилированный модуль, скажем Module1.pyc
). Чтобы быть точным, структура каталогов:
.\Main.py
.\__pycache__\Module1.cpython-32.pyc
Когда я использую интерпретатор python для запуска основного скрипта, он не может найти модуль со следующей ошибкой:
Traceback (most recent call last):
File "Main.py", line 10, in <module>
import Module1
ImportError: No module named Module1
Обратите внимание, что я добавил текущий каталог в PYTHONPATH
переменная окружения, и является частью sys.path
, Кроме того, внутренний __pycache__
каталог также добавлен, и виден в sys.path
,
Не уверен, почему Module1 не найден. Я предполагаю, что это может быть из-за другого имени файла - Module1.cpython-32.pyc? Но тогда именно так интерпретатор Python 3.2 генерирует его.
3 ответа
Посмотрите на PEP-3147. Они описывают, как работает механизм поиска Python.
Итак, в вашем конкретном случае: поместите файл Module1.pyc прямо в корневую папку.
Как указано ниже, два шага решили проблему: Шаг 1: Скопируйте файл Module.cpython-32.pyc из каталога.__pycache__ в.\ Шаг 2: Переименуйте файл в Module.pyc
PS: спасибо gecco за то, что поделились деталями.
Эта проблема может зависеть от того, какую версию Python вы используете, поскольку системы сборки/компиляции/упаковки менялись с годами.
Для python 3.9 я обнаружил, что эта команда работает:
# recursively compile all modules
python -m compileall -b .
# run the compiled version of your `Main.py`
python Main.pyc
Объяснение
Основная проблема в том, что в последних версиях python/package_dir/my_module.py
компилируется в/package_dir/__pycache__/my_module.cpython-64.pyc
(или какая-то вариация). Система обнаружения модулей видимо не заглядывает в__pycache__
, в результатеmodule not found
ошибка вmy_module
заявление об импорте. -b
флаг указывает компилятору записывать скомпилированные файлы в то же место, что и исходный код.py
файлы, чтобы их можно было обнаружить.