Как я могу вручную создать файл.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 в байт-код
С помощью
py_compile.compile
:import py_compile py_compile.compile('YourFileName.py')
С помощью
py_compile.main()
:Он компилирует несколько файлов одновременно.
import py_compile py_compile.main(['File1.py','File2.py','File3.py'])
Список может расти столько, сколько вы хотите. В качестве альтернативы вы можете явно передать список файлов в main или даже вы можете передать имена файлов в аргументах командной строки.
Или, если вы пройдете
['-']
в основном он может компилировать файлы в интерактивном режиме.С помощью
py_compile
в терминале:python -m py_compile File1.py File2.py File3.py ...
-m
указывает имя модуля (модулей) для компиляции.Или для интерактивной компиляции файлов
python -m py_compile - File1.py File2.py File3.py . . .
С помощью
compileall.compile_dir()
:import compileall compileall.compile_dir(direname)
Он компилирует каждый отдельный файл Python, присутствующий в поставляемом каталоге.
С помощью
compileall.compile_file()
:import compileall compileall.compile_file('YourFileName.py')
Посмотрите на ссылки ниже:
Я бы использовал 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.
- создайте новый файл python в каталоге файла.
- тип
import (the name of the file without the extension)
- запустить файл
- откройте каталог, затем найдите папку pycache
- внутри должен быть ваш .pyc файл
Есть два способа сделать это
- Командная строка
- Использование программы 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