Как я могу вручную создать файл.pyc из файла.py

По какой-то причине я не могу полагаться на оператор импорта Python для автоматического создания файла.pyc

Есть ли способ реализовать функцию следующим образом?

def py_to_pyc(py_filepath, pyc_filepath):
    ...

10 ответов

Вы можете использовать compileall в терминале. Следующая команда рекурсивно перейдет в подкаталоги и создаст pyc-файлы для всех найденных файлов python. Модуль compileall является частью стандартной библиотеки python, поэтому вам не нужно устанавливать ничего лишнего, чтобы использовать его. Это работает точно так же для python2 и python3.

python -m compileall .

Вы можете скомпилировать отдельные файлы из командной строки с помощью:

python -m compileall <file_1>.py <file_n>.py

Прошло много времени с тех пор, как я последний раз использовал Python, но я верю, что вы можете использовать py_compile:

import py_compile
py_compile.compile("file.py")

Я нашел несколько способов скомпилировать скрипт Python в байт-код

  1. С помощью py_compile.compile:

    import py_compile
    py_compile.compile('YourFileName.py')
    
  2. С помощью py_compile.main():

    Он компилирует несколько файлов одновременно.

    import py_compile
    py_compile.main(['File1.py','File2.py','File3.py'])
    

    Список может расти столько, сколько вы хотите. В качестве альтернативы вы можете явно передать список файлов в main или даже вы можете передать имена файлов в аргументах командной строки.

    Или, если вы пройдете ['-'] в основном он может компилировать файлы в интерактивном режиме.

  3. С помощью py_compile в терминале:

    python -m py_compile File1.py File2.py File3.py ...
    

    -m указывает имя модуля (модулей) для компиляции.

    Или для интерактивной компиляции файлов

    python -m py_compile -
    File1.py
    File2.py
    File3.py
       .
       .
       .
    
  4. С помощью compileall.compile_dir():

    import compileall
    compileall.compile_dir(direname)
    

    Он компилирует каждый отдельный файл Python, присутствующий в поставляемом каталоге.

  5. С помощью compileall.compile_file():

    import compileall
    compileall.compile_file('YourFileName.py')
    

Посмотрите на ссылки ниже:

https://docs.python.org/3/library/py_compile.html

https://docs.python.org/3/library/compileall.html

Я бы использовал compileall. Он прекрасно работает как из скриптов, так и из командной строки. Это немного более высокий уровень модуля / инструмента, чем уже упоминавшийся py_compile, который он также использует внутри.

В Python2 вы можете использовать:

python -m compileall <pythonic-project-name>

что заставляет компилировать все .py в .pyc в проекте, который содержал подпапки.


В Python3 вы можете использовать:

python3 -m compileall <pythonic-project-name>

что заставляет компилировать все .py к __pycache__ папки в проекте, который содержит подпапки.

Или с Browning из этого поста:

Вы можете применять тот же макет .pyc файлы в папках, как в Python2, используя:

python3 -m compileall -b <pythonic-project-name>

Опция -b запускает вывод .pyc файлы в их прежние места (то же, что и в Python2).

Чтобы соответствовать исходным требованиям вопроса (исходный путь и целевой путь), код должен быть таким:

import py_compile
py_compile.compile(py_filepath, pyc_filepath)

Если во входном коде есть ошибки, то возникает исключение py_compile.PyCompileError.

  1. создайте новый файл python в каталоге файла.
  2. тип import (the name of the file without the extension)
  3. запустить файл
  4. откройте каталог, затем найдите папку pycache
  5. внутри должен быть ваш .pyc файл

Есть два способа сделать это

  1. Командная строка
  2. Использование программы Python

Если вы используете командную строку, используйте python -m compileall <argument> для компиляции кода Python в двоичный код Python. Пример:python -m compileall -x ./*

Или вы можете использовать этот код для компиляции вашей библиотеки в байт-код.

import compileall
import os

lib_path = "your_lib_path"
build_path = "your-dest_path"

compileall.compile_dir(lib_path, force=True, legacy=True)

def compile(cu_path):
    for file in os.listdir(cu_path):
        if os.path.isdir(os.path.join(cu_path, file)):
            compile(os.path.join(cu_path, file))
        elif file.endswith(".pyc"):
            dest = os.path.join(build_path, cu_path ,file)
            os.makedirs(os.path.dirname(dest), exist_ok=True)
            os.rename(os.path.join(cu_path, file), dest)

compile(lib_path)

см. подробную документацию на docs.python.org.

      python3 -c "import compileall; compileall.compile_dir('.')" 

find . -name '*.py' -delete
Другие вопросы по тегам