Как запустить файл.pyc, когда он импортирует некоторые другие файлы.py?

main.py

import other

def main():
   other.test()

main()

other.py

def test():
   print("Hello")

Используя python3 -m py_compile *.py Я могу иметь 2 .pyc файлы.

Тем не мение, main.pyc не может быть запущен, если есть no module named other Это ошибка, которую я получил от терминала.

Идея состоит в том, чтобы собрать весь проект из .py в .pyc так что люди могут запускать их без обмена исходным кодом.

Итак, как запустить это main.pyc который импортирует другие библиотеки, не разделяя исходный код?

3 ответа

Этого также можно добиться с помощью этой команды:

python -m compileall -b .

Попросил группу машинного обучения. Вот что я нашел. Пока, main.py а также other.py скомпилированы в main.pyc а также other.pycЯ могу запустить его python3 main.pyc,

До этого мой питон автоматически конвертирует other.py в other.cpython-35.pyc, В этом случае, main.pyc не могу import other так как нет other в папке (это называется other.cpython-35 сейчас).

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

Короткий ответ

Python будет игнорировать файлы, если рядом с ним существует исходный файл. Итак, после генерацииmain.pycиother.pyc, убедитесь, что исходные файлыmain.pyиother.pyперемещаются из каталога.

Чтобы можно было использовать вместо файлов.

  • Скомпилированные файлы должны находиться в той же папке, что и исходные файлы.
  • Имя файла должно совпадать с именем исходного файла.
  • Исходные файлы больше не должны существовать рядом с

Длинный ответ

При выполнении Python исходные файлы компилируются в скомпилированные файлы, даже если это не требуется явно.

  • Legacy Python создаст файлы в том же каталоге, что и исходные файлы, и с тем же именем.
  • В более новых версиях файл создается в папке с именем, и имя файла будет включать «магическую строку», основанную на версии Python. Напримерfoo.cpython-37.pyc.

Итак, в новых версиях Python

  • их необходимо переименовать, чтобы удалить магическое число,foo.cython-37.pycкfoo.pyc
  • файлы необходимо переместить из__pycache__папку в родительскую исходную папку

Вышеописанное может быть достигнуто с помощьюcompileallмодуль, который должен существовать по умолчанию в установках Python.

python -m compileall -b .

The -bФлаг записывает файлы байт-кода в их устаревшие местоположения и имена, что может перезаписать файлы байт-кода, созданные другой версией Python. По умолчанию файлы записываются в их местоположения и имена PEP 3147, что позволяет сосуществовать файлам байт-кода из нескольких версий Python.

Рекомендации

PEP 3147 – Каталоги репозитория PYC дает представление оpyиpycфайлы.

Вот несколько соответствующих разделов.

Фон

CPython компилирует свой исходный код в «байт-код» и по соображениям производительности кэширует этот байт-код в файловой системе при каждом изменении исходного файла. Это значительно ускоряет загрузку модулей Python, поскольку можно пропустить этап компиляции.

Предложение

Механизм импорта Python расширен для записи и поиска файлов кэша байт-кода в одном каталоге внутри каждого каталога пакета Python. Этот каталог будет называться pycache .

Кроме того, имена файлов pyc будут содержать магическую строку (называемую «тегом»), которая отличает версию Python, для которой они были скомпилированы. Это позволяет сосуществовать нескольким скомпилированным по байтам файлам кэша в одном исходном файле Python.

Поведение Python. Случай 3: pycache/foo..pyc без источника

Возможно, файл foo.py каким-то образом был удален, а кэшированный файл pyc остался в файловой системе. Если файл pycache /foo..pyc существует, но файл foo.py, использованный для его создания, отсутствует, Python выдаст ошибку ImportError при запросе на импорт foo. Другими словами, Python не будет импортировать файл pyc из каталога кэша, если исходный файл не существует.

Поведение Python. Случай 4: устаревшие файлы pyc и импорт без исходного кода.

Python будет игнорировать все устаревшие файлы pyc, если рядом с ним существует исходный файл. Другими словами, если файл foo.pyc существует рядом с файлом foo.py, файл pyc будет игнорироваться во всех случаях.

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

Другие вопросы по тегам