Не создается файл pyc
Примечание. Все компоненты обеих систем были установлены с использованием APT (из deb-packages). Я не пользовалась pip / pip3 , make install , checkinstall и другие подобные утилиты. Так что это абсолютно по теме. Это Ubuntu, Ubuntu использует APT.
Первая система имеет следующее pyc -файлы:
- /usr/lib/python2.7/dist-packages/gi/overrides/Dee.pyc
- /usr/lib/python3/dist-packages/gi/overrides/__pycache__/Dee.cpython-36.pyc
- /usr/lib/python2.7/dist-packages/gi/overrides/Unity.pyc
- /usr/lib/python3/dist-packages/gi/overrides/__pycache__/Unity.cpython-36.pyc
Вторая система не имеет этих файлов.
Я не могу найти пакеты для этих файлов с dpkg -S , Но я могу найти для скриптов ( *.py ).
Насколько я могу понять, эти файлы пришли gir1.2-dee-1.0 а также gir1.2-unity-5.0 ,
Но после переустановки этих пакетов *.pyc файлы не создаются.
Что случилось?
Как получить *.pyc на своих местах? Будет ли моя система работать нормально без этих файлов?
2 ответа
Это не связано с APT, так что это займет некоторое время;-)
Как получить *.pyc на свои места?
Если вы действительно хотите, вы можете сделать это вручную с помощью py_compile. Из командной строки python (замените на тот, который вы хотите скомпилировать):
Существует также метод командной строки, который позволяет скомпилировать все в каталоге с.
Хотя на самом деле в этом нет необходимости: они создаются при использовании программного обеспечения на вашем компьютере. Вот почему это не имеет отношения к APT.
Будет ли моя система работать нормально без этих файлов?
Что на самом деле происходит: когда модуль импортируется или когда источник был изменен, .pyc файл, содержащий скомпилированный код, будет создан в том же каталоге, что и .py file , Этот файл используется для пропуска этапа компиляции для этого модуля. Экономит несколько миллисекунд при выполнении (не важно для обычного использования, но представьте, что веб-сервер вызывает один и тот же сценарий 1000 раз за секунду. Эти миллисекунды внезапно становятся важными).
Что касается не видя .pyc файл где-то:
Есть моменты, когда Python не может скомпилировать. 1 пример: если вы используете второго пользователя, которому не разрешено создавать файл в месте, где будет храниться компиляция. Выполнение не остановится, а затем будет использовать исходный код (а не скомпилированную версию) (запуск сценария не считается импортом; это делается только для модулей).
В этой статье будут рассмотрены Python типы файлов .pyc, .pyd и .pyo, предназначенные для хранения байт-кода, который будет импортирован другими Python программами.
Все кто когда-либо писал программы на Python уже встречались с .py файлами, но будет не менее интересно узнать, какую роль играют эти и другие типы файлов и где они находят своё применение. Чтобы понять это, будет рассмотрено преобразование кода на Python в инструкции, которые напрямую может выполнить компьютер.
Байт-код и виртуальная машина Python
Python поставляется с интерпретатором, который может использоваться в качестве REPL (цикл «чтение — вычисление — вывод»), в интерактивном режиме и в командной строке. Кроме того, можно вызвать Python со скриптами кода Python. В обоих случаях интерпретатор анализирует получаемый файл, а затем компилируется его в байт-код (низкий уровень машинных инструкций), которое затем выполняется с помощью виртуальной машины Python.
Однако он отличается от других виртуальных машин, таких как виртуальная машина Java или виртуальная машина Erlang, поэтому заслуживает самостоятельного рассмотрения. Виртуальная машина, в свою очередь, взаимодействует с операционной системой и реальным оборудованием для выполнения машинных инструкций.
Важная вещь, о которой следует помнить, что файлы типа .pyc, .pyo и .pyd, создаются интерпретатором Python, когда он преобразует человекочитаемый код в скомпилированный байт-код. Компиляция Python скрипта в байт-код является необходимым промежуточным шагом в процессе перевода инструкций из исходного кода на удобочитаемом языке в машинные инструкции, которые потом выполняет операционная система.
.pyc файлы
Файлы типа .pyc автоматически генерируются интерпретатором при импорте модуля, что ускоряет следующие импорты этого модуля. Поэтому такие файлы создаются только из .py файлов, если они импортируется другим .py файлом или модулем.
Пример модуля Python, который потом будет импортирован. Данный модуль вычисляет факториал числа.
Теперь, если запустить модуль из командной строки, используя python math_helpers.py, файл .pyc создан не будет.
Теперь импортируем его в другом модуле, как показано ниже.
Производится импорт factorial функции из файла math_helpers.py и вызов её для вычисления факториала 6.
Запустим скрипт, вызвав python computations.py в терминале. В результате получаем не только факториал 6 (6!=720), но также замечаем, что интерпретатор автоматически создал файл math_helpers.pyc. Это происходит потому, что основной модуль импортирует math_helpers. Чтобы ускорить загрузку импортированного модуля в будущем, интерпретатор создает файл байт-кода модуля.
Когда обновляется файл исходного кода, также обновляется и файл .pyc. Это происходит всякий раз, когда время обновления исходного кода отличается от времени файла байт-кода и это гарантирует обновление байт-кода.
Обратите внимание: использование файлов .pyc только ускоряет загрузку программы, а не её выполнение. Это означает, что можно улучшить время запуска, написав основную программу модулем, который импортируется другим, меньшим модулем. Однако для повышения производительности в целом необходимо изучить такие методы, как оптимизация алгоритмов и алгоритмический анализ.
Поскольку .pyc-файлы независимы от платформы, они могут быть распределены между компьютерами разных архитектур. Однако, если разработчики работают в разных часовых поясах, коммит .pyc файлов в CVS может создавать временные метки в будущем. Таким образом, обновления исходного кода больше не вызывают изменения в байт-коде. Это может породить неприятные ошибки. Лучший способ избежать этого – добавить файлы .pyc в список игнорирования в системе управления версиями (.gitignore).
Файлы .pyo
Файлы .pyo также создается интерпретатором при импорте модуля, но с указанием интерпретатору включения параметров оптимизации.
Оптимизатор активируется добавлением флага «-O» при вызове интерпретатора Python. Пример кода, иллюстрирующий использование оптимизации. Во-первых, у нас есть модуль, который определяет лямбду. В Python лямбда подобна функции, но определяется более кратко.
В следующем коде импортируем lambdas.py и вызовем g lambda.
Теперь перейдём к важной части этого примера. Вместо обычного вызова Python, как в последнем примере, мы будем использовать оптимизацию. Если включить оптимизатор, создаются более компактные файлы байт-кода, чем без использования оптимизатора.
Чтобы запустить пример с помощью оптимизатора, вызовем команду:
Мы не только получаем правильный результат удвоения 7 (14), как вывод в командной строке, но также видим, что для нас автоматически создается новый файл байткода. Этот файл основан на файле lambdas.py в вызове using_lambdas.py. Поскольку у нас включен оптимизатор, создается файл байт-кода .pyo. В нашем случае он называется lambdas.pyo.
Оптимизатор удаляет операторы assert из байт-кода и всё. В большинстве случаев результат не будет заметным, но могут быть случаи, когда это может быть полезно.
Также обратите внимание, файл байт-кода .pyo заменяет файл .pyc, который был бы создан без оптимизации. Файл .pyo обновляется всякий раз, когда время обновления исходного кода отличается от времени файла байт-кода.
Тип файла .pyd
Тип файла .pyd, в отличие от предыдущих двух, предназначен только для семейства ОС Windows. Таким образом он может встретиться в дистрибутивах установленных программ в персональных и корпоративных версиях Windows 10, 8, 7 и других.
В экосистеме Windows файл .pyd представляет собой файл библиотеки, содержащий код Python, который может быть вызван и использован другими приложениями Python. Чтобы сделать эту библиотеку доступной для других программ Python, она упакована в виде динамически подключаемой библиотеки.
Динамически подключаемые библиотеки (DLL) – это библиотеки скомпилированного кода Windows, которые подключаются к вызывающей её программе во время выполнения. Основным преимуществом таких библиотек как DLL, является то, что они облегчают повторное использование кода, позволяют строить модульные архитектуры и ускоряют запуск программ. В результате библиотеки DLL обеспечивают большую функциональность в ОС Windows.
Файлы .pyd – это dll, но есть несколько отличий. Если есть DLL файл с именем hello.pyd, он должен содержать функцию inithello() как точку входа. Затем можно написать в Python «import hello», и интерпретатор будет искать hello.pyd (а также hello.py, hello.pyc), и если он найдет его, попытается вызвать inithello() для его инициализации.
Обратите внимание, что путь поиска для hello.pyd – это PYTHONPATH и это не тот путь, который использует Windows для поиска hello.dll.
Различия между типами файлов
Хотя между этими типами файлов существует некоторое сходство, есть также и некоторые значительные различия. Например, файлы .pyc и .pyo во многом аналогичны, поскольку они содержат байт-код Python, отличие же заключается в том, что файлы .pyo более компактны, благодаря оптимизации, сделанной интерпретатором.
Третий тип файла .pyd отличается от предыдущих двух тем, что является DLL, которая будет использоваться в ОС Windows. Остальные два типа файлов могут использоваться в любой операционной системе, а не только в Windows.
Вывод
В этой статье было рассказано о специальных типах файлов .pyc, .pyo и .pyd используемых виртуальной машиной Python для повторного использования кода. Каждый файл, как мы видели, имеет своё особое назначение и варианты использования, будь то ускорение загрузки модуля, ускорение выполнения или облегчение повторного использования кода.
В этой статье мы рассмотрим типы файлов Python .pyc, .pyo и .pyd, а также то, как они используются для хранения байт-кода, который будет импортирован другими программами.
Возможно, вы работали с файлами .py при написании кода Python, но вы хотите знать, что делают эти другие типы файлов и где они используются. Чтобы понять это, мы рассмотрим, как Python преобразует код, который вы пишете, в инструкции, которые машина может выполнять напрямую.
Байт-код и виртуальная машина
Python поставляется с интерпретатором, который можно использовать, как REPL (read-eval-print-loop) в интерактивном режиме в командной строке. В качестве альтернативы вы можете вызвать Python со сценариями кода Python.
В обоих случаях интерпретатор анализирует ваш ввод, а затем компилирует его в байт-код (машинные инструкции нижнего уровня), который затем выполняется «питоническим представлением» компьютера. Это представление Pythonic называется виртуальной машиной.
Однако он достаточно отличается от других виртуальных машин, таких как Java или Erlang, и заслуживает отдельного изучения. Виртуальная машина, в свою очередь, взаимодействует с операционной системой и реальным оборудованием для выполнения машинных инструкций.
Когда вы видите типы файлов .pyc, .pyo и .pyd, важно помнить, что это файлы, созданные интерпретатором Python при преобразовании кода в скомпилированный байт-код. Компиляция исходного кода Python в байт-код является необходимым промежуточным этапом в процессе преобразования инструкций из исходного кода на понятном человеку языке в машинные инструкции, которые может выполнять ваша операционная система.
В этой статье мы рассмотрим каждый тип файла по отдельности, но сначала мы кратко рассмотрим виртуальную машину и байт-код в Python.
Тип файла .pyc
Сначала рассмотрим тип файла .pyc, который автоматически генерируются интерпретатором при импорте модуля, что ускоряет импорт этого модуля в будущем. Следовательно, эти файлы создаются из файла .py только в том случае, если он импортируется другим файлом.
Вот пример модуля, который мы хотим импортировать. Этот модуль вычисляет факториалы.
Теперь, когда вы просто запускаете этот модуль из командной строки, используя math_helpers.py, файлы .pyc не создаются.
Теперь давайте импортируем это в другой модуль, как показано ниже. Мы импортируем факториал из файла math_helpers.py и используем его для вычисления факториала 6.
Мы можем запустить этот скрипт, вызвав computations.py в терминале. Мы не только получаем результат 6 факториала, то есть 720, но мы также замечаем, что интерпретатор автоматически создает файл math_helpers.pyc. Это происходит потому, что модуль вычислений импортирует модуль math_helpers. Чтобы в дальнейшем ускорить загрузку импортированного модуля, интерпретатор создает файл байт-кода модуля.
При обновлении файла исходного кода обновляется и файл .pyc. Это происходит всякий раз, когда время обновления исходного кода отличается от времени обновления файла байт-кода и обеспечивает актуальность байт-кода.
Обратите внимание, что использование файлов .pyc только ускоряет загрузку вашей программы, но не ее фактическое выполнение. Это означает, что вы можете сократить время запуска, написав свою основную программу в модуле, который импортируется другим, меньшим модулем. Однако для повышения производительности в более общем плане вам необходимо изучить такие методы, как оптимизация алгоритмов и алгоритмический анализ.
Поскольку файлы .pyc не зависят от платформы, они могут использоваться на машинах с разной архитектурой. Однако, если разработчики имеют разное время в своих системах, проверка файлов .pyc в системе управления версиями может создать временные метки, которые фактически относятся к будущему для показаний времени других. Таким образом, обновления исходного кода больше не вызывают изменений в байт-коде. Это может быть неприятной ошибкой. Лучший способ избежать этого – добавить файлы .pyc в список игнорирования в вашей системе контроля версий.
Тип файла .pyo
Тип файла .pyo также создается интерпретатором при импорте модуля. Однако файл .pyo является результатом запуска интерпретатора при включенных настройках оптимизации.
Оптимизатор включается добавлением флага «-O» при вызове интерпретатора Python. Вот пример кода, иллюстрирующий использование оптимизации. Во-первых, у нас есть модуль, определяющий лямбда, которая похожа на функцию, но определяется более лаконично.
Если вы помните из предыдущего примера, нам нужно будет импортировать этот модуль, чтобы использовать его. В следующем листинге кода мы импортируем lambdas.py и используем лямбда g.
Теперь мы подошли к важной части этого примера. Вместо обычного вызова Python, как в последнем примере, мы воспользуемся здесь оптимизацией. При включенном оптимизаторе создаются файлы байт-кода меньшего размера, чем когда оптимизатор не используется.
Чтобы запустить этот пример с помощью оптимизатора, вызовите команду:
Мы не только получаем правильный результат удвоения 7, то есть 14, в качестве вывода в командной строке, но мы также видим, что для нас автоматически создается новый файл байт-кода. Этот файл основан на импорте lambdas.py при вызове using_lambdas.py. Поскольку у нас был включен оптимизатор, создается файл байт-кода .pyo. В данном случае он называется lambdas.pyo.
Оптимизатор, который мало что делает, удаляет утверждения assert из вашего байт-кода. Результат в большинстве случаев будет незаметен, но иногда он может понадобиться.
Также обратите внимание, что, поскольку создается файл байт-кода .pyo, он заменяет файл .pyc, который был бы создан без оптимизации. При обновлении файла исходного кода файл .pyo обновляется всякий раз, когда время обновления исходного кода отличается от времени обновления файла байт-кода.
Тип файла .pyd
Тип файла .pyd, в отличие от двух предыдущих, зависит от платформы для класса операционных систем Windows. Таким образом, его можно часто встретить в персональных и корпоративных выпусках Windows 10, 8, 7 и других.
В экосистеме Windows файл .pyd – это файл библиотеки, содержащий код Python, который может вызываться и использоваться другими приложениями. Чтобы сделать эту библиотеку доступной для других программ, она упакована в виде библиотеки динамической компоновки.
Библиотеки динамической компоновки (DLL) – это библиотеки кода Windows, которые связаны с вызывающими программами во время выполнения. Основное преимущество связывания с библиотеками во время выполнения, такими как библиотеки DLL, заключается в том, что это облегчает повторное использование кода, модульную архитектуру и более быстрый запуск программы. В результате библиотеки DLL предоставляют множество функций в операционных системах Windows.
Файл .pyd – это библиотека динамической компоновки, которая содержит модуль Python или набор модулей, которые будут вызываться другим кодом. Чтобы создать файл .pyd, вам необходимо создать модуль с именем, например, example.pyd. В этом модуле вам нужно будет создать функцию с именем PyInit_example(). Когда программы вызывают эту библиотеку, им нужно вызвать import foo, и функция PyInit_example() будет запущена.
Различия между этими типами файлов
Хотя между этими типами файлов существует некоторое сходство, есть также и некоторые большие различия. Например, хотя файлы .pyc и .pyo похожи тем, что содержат байт-код Python, они отличаются тем, что файлы .pyo более компактны благодаря оптимизации, выполненной интерпретатором.
Третий тип файла, .pyd, отличается от двух предыдущих тем, что представляет собой динамически подключаемую библиотеку, которая будет использоваться в операционной системе Windows. Два других типа файлов можно использовать в любой операционной системе, а не только в Windows.
Однако каждый из этих типов файлов включает код, который вызывается и используется другими программами Python.
Заключение
В этой статье мы описали, как каждый специальный тип файла, .pyc, .pyo и .pyd, используется виртуальной машиной для повторного использования кода. Как мы видели, каждый файл имеет свои особые цели и варианты использования, будь то ускорение загрузки модуля, ускорение выполнения или облегчение повторного использования кода в определенных операционных системах.
В этой статье будут рассмотрены Python типы файлов .pyc, .pyd и .pyo, предназначенные для хранения байт-кода, который будет импортирован другими Python программами.
Все кто когда-либо писал программы на Python уже встречались с .py файлами, но будет не менее интересно узнать, какую роль играют эти и другие типы файлов и где они находят своё применение. Чтобы понять это, будет рассмотрено преобразование кода на Python в инструкции, которые напрямую может выполнить компьютер.
Байт-код и виртуальная машина Python
Python поставляется с интерпретатором, который может использоваться в качестве REPL (цикл «чтение — вычисление — вывод»), в интерактивном режиме и в командной строке. Кроме того, можно вызвать Python со скриптами кода Python. В обоих случаях интерпретатор анализирует получаемый файл, а затем компилируется его в байт-код (низкий уровень машинных инструкций), которое затем выполняется с помощью виртуальной машины Python.
Однако он отличается от других виртуальных машин, таких как виртуальная машина Java или виртуальная машина Erlang, поэтому заслуживает самостоятельного рассмотрения. Виртуальная машина, в свою очередь, взаимодействует с операционной системой и реальным оборудованием для выполнения машинных инструкций.
Важная вещь, о которой следует помнить, что файлы типа .pyc, .pyo и .pyd, создаются интерпретатором Python, когда он преобразует человекочитаемый код в скомпилированный байт-код. Компиляция Python скрипта в байт-код является необходимым промежуточным шагом в процессе перевода инструкций из исходного кода на удобочитаемом языке в машинные инструкции, которые потом выполняет операционная система.
.pyc файлы
Файлы типа .pyc автоматически генерируются интерпретатором при импорте модуля, что ускоряет следующие импорты этого модуля. Поэтому такие файлы создаются только из .py файлов, если они импортируется другим .py файлом или модулем.
Пример модуля Python, который потом будет импортирован. Данный модуль вычисляет факториал числа.
Теперь, если запустить модуль из командной строки, используя python math_helpers.py, файл .pyc создан не будет.
Теперь импортируем его в другом модуле, как показано ниже.
Производится импорт factorial функции из файла math_helpers.py и вызов её для вычисления факториала 6.
Запустим скрипт, вызвав python computations.py в терминале. В результате получаем не только факториал 6 (6!=720), но также замечаем, что интерпретатор автоматически создал файл math_helpers.pyc. Это происходит потому, что основной модуль импортирует math_helpers. Чтобы ускорить загрузку импортированного модуля в будущем, интерпретатор создает файл байт-кода модуля.
Когда обновляется файл исходного кода, также обновляется и файл .pyc. Это происходит всякий раз, когда время обновления исходного кода отличается от времени файла байт-кода и это гарантирует обновление байт-кода.
Обратите внимание: использование файлов .pyc только ускоряет загрузку программы, а не её выполнение. Это означает, что можно улучшить время запуска, написав основную программу модулем, который импортируется другим, меньшим модулем. Однако для повышения производительности в целом необходимо изучить такие методы, как оптимизация алгоритмов и алгоритмический анализ.
Поскольку .pyc-файлы независимы от платформы, они могут быть распределены между компьютерами разных архитектур. Однако, если разработчики работают в разных часовых поясах, коммит .pyc файлов в CVS может создавать временные метки в будущем. Таким образом, обновления исходного кода больше не вызывают изменения в байт-коде. Это может породить неприятные ошибки. Лучший способ избежать этого – добавить файлы .pyc в список игнорирования в системе управления версиями (.gitignore).
Файлы .pyo
Файлы .pyo также создается интерпретатором при импорте модуля, но с указанием интерпретатору включения параметров оптимизации.
Оптимизатор активируется добавлением флага «-O» при вызове интерпретатора Python. Пример кода, иллюстрирующий использование оптимизации. Во-первых, у нас есть модуль, который определяет лямбду. В Python лямбда подобна функции, но определяется более кратко.
В следующем коде импортируем lambdas.py и вызовем g lambda.
Теперь перейдём к важной части этого примера. Вместо обычного вызова Python, как в последнем примере, мы будем использовать оптимизацию. Если включить оптимизатор, создаются более компактные файлы байт-кода, чем без использования оптимизатора.
Чтобы запустить пример с помощью оптимизатора, вызовем команду:
Мы не только получаем правильный результат удвоения 7 (14), как вывод в командной строке, но также видим, что для нас автоматически создается новый файл байткода. Этот файл основан на файле lambdas.py в вызове using_lambdas.py. Поскольку у нас включен оптимизатор, создается файл байт-кода .pyo. В нашем случае он называется lambdas.pyo.
Оптимизатор удаляет операторы assert из байт-кода и всё. В большинстве случаев результат не будет заметным, но могут быть случаи, когда это может быть полезно.
Также обратите внимание, файл байт-кода .pyo заменяет файл .pyc, который был бы создан без оптимизации. Файл .pyo обновляется всякий раз, когда время обновления исходного кода отличается от времени файла байт-кода.
Тип файла .pyd
Тип файла .pyd, в отличие от предыдущих двух, предназначен только для семейства ОС Windows. Таким образом он может встретиться в дистрибутивах установленных программ в персональных и корпоративных версиях Windows 10, 8, 7 и других.
В экосистеме Windows файл .pyd представляет собой файл библиотеки, содержащий код Python, который может быть вызван и использован другими приложениями Python. Чтобы сделать эту библиотеку доступной для других программ Python, она упакована в виде динамически подключаемой библиотеки.
Динамически подключаемые библиотеки (DLL) – это библиотеки скомпилированного кода Windows, которые подключаются к вызывающей её программе во время выполнения. Основным преимуществом таких библиотек как DLL, является то, что они облегчают повторное использование кода, позволяют строить модульные архитектуры и ускоряют запуск программ. В результате библиотеки DLL обеспечивают большую функциональность в ОС Windows.
Файлы .pyd – это dll, но есть несколько отличий. Если есть DLL файл с именем hello.pyd, он должен содержать функцию inithello() как точку входа. Затем можно написать в Python «import hello», и интерпретатор будет искать hello.pyd (а также hello.py, hello.pyc), и если он найдет его, попытается вызвать inithello() для его инициализации.
Обратите внимание, что путь поиска для hello.pyd – это PYTHONPATH и это не тот путь, который использует Windows для поиска hello.dll.
Различия между типами файлов
Хотя между этими типами файлов существует некоторое сходство, есть также и некоторые значительные различия. Например, файлы .pyc и .pyo во многом аналогичны, поскольку они содержат байт-код Python, отличие же заключается в том, что файлы .pyo более компактны, благодаря оптимизации, сделанной интерпретатором.
Третий тип файла .pyd отличается от предыдущих двух тем, что является DLL, которая будет использоваться в ОС Windows. Остальные два типа файлов могут использоваться в любой операционной системе, а не только в Windows.
Вывод
В этой статье было рассказано о специальных типах файлов .pyc, .pyo и .pyd используемых виртуальной машиной Python для повторного использования кода. Каждый файл, как мы видели, имеет своё особое назначение и варианты использования, будь то ускорение загрузки модуля, ускорение выполнения или облегчение повторного использования кода.
Читайте также: