Как запустить файл.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, если он находится там, где должен был находиться исходный файл.