Z jakiegoś powodu nie mogę polegać na instrukcji „import” w języku Python, która automatycznie wygeneruje plik .pyc
Czy istnieje sposób na zaimplementowanie następującej funkcji?
def py_to_pyc(py_filepath, pyc_filepath):
...
Możesz użyć compileall
w terminalu. Następujące polecenie przejdzie rekurencyjnie do podkatalogów i utworzy pliki pyc dla wszystkich znalezionych plików Pythona. Compileall moduł jest częścią standardowej biblioteki Pythona, więc nie ma potrzeby instalowania żadnych dodatków, aby go używać. Działa to dokładnie w ten sam sposób w przypadku python2 i python3.
python -m compileall .
-O
flagę kompilacji kodu bajtowego (plik .pyo iso .pyc).compileall
folderze z pakietami witryn i wszystko zepsułoMożesz skompilować pojedyncze pliki z wiersza poleceń za pomocą:
źródło
Minęło trochę czasu, odkąd ostatnio korzystałem z Pythona, ale uważam, że możesz użyć
py_compile
:import py_compile py_compile.compile("file.py")
źródło
__pycache__/file.cpython-32.pyc
i otrzymasz to jako wartość zwracaną.Znalazłem kilka sposobów kompilacji skryptów Pythona do kodu bajtowego
Korzystanie
py_compile
w terminalu:-m
określa nazwy modułów do skompilowania.Lub do interaktywnej kompilacji plików
Używając
py_compile.compile
:import py_compile py_compile.compile('YourFileName.py')
Używając
py_compile.main()
:Kompiluje jednocześnie kilka plików.
import py_compile py_compile.main(['File1.py','File2.py','File3.py'])
Lista może rosnąć tak długo, jak chcesz. Alternatywnie możesz oczywiście przekazać listę plików w głównych lub nawet nazwach plików w argumentach wiersza poleceń.
Lub, jeśli przekażesz
['-']
main, może on interaktywnie kompilować pliki.Używając
compileall.compile_dir()
:import compileall compileall.compile_dir(direname)
Kompiluje każdy pojedynczy plik Pythona obecny w podanym katalogu.
Używając
compileall.compile_file()
:import compileall compileall.compile_file('YourFileName.py')
Spójrz na poniższe linki:
https://docs.python.org/3/library/py_compile.html
https://docs.python.org/3/library/compileall.html
źródło
py_compile
icompileall
NIEpy_compile.py
lubcompileall.py
. Innymi słowy, powinno to byćpython3 -m py_compile PYTHON_FILENAME
lubpython3 -m compileall PYTHON_FILES_DIRECTORY
.Użyłbym compileall . Działa dobrze zarówno z poziomu skryptów, jak iz wiersza poleceń. Jest to moduł / narzędzie nieco wyższego poziomu niż wspomniany już py_compile , którego używa również wewnętrznie.
źródło
compileall
nie zawiera logiki do pomijania plików, dla których odpowiadający im.pyc
plik jest już aktualny, prawda?compileall
pomija pliki, które są już aktualne.pyc
(testowane z Pythonem 2.7.11)W Pythonie2 możesz użyć:
który kompiluje wszystkie
.py
pliki do.pyc
plików w projekcie, który zawiera zarówno pakiety, jak i moduły.W Pythonie3 możesz użyć:
który kompiluje wszystkie
.py
pliki do__pycache__
folderów w projekcie, który zawiera zarówno pakiety, jak i moduły.Lub z brązowieniem z tego posta :
źródło
Aby dopasować oryginalne wymagania dotyczące pytania (ścieżka źródłowa i ścieżka docelowa), kod powinien wyglądać następująco:
import py_compile py_compile.compile(py_filepath, pyc_filepath)
Jeśli kod wejściowy zawiera błędy, zgłaszany jest wyjątek py_compile.PyCompileError .
źródło
Można to zrobić na dwa sposoby
Jeśli używasz wiersza poleceń,
python -m compileall <argument>
skompiluj kod Pythona do kodu binarnego Pythona. Dawny:python -m compileall -x ./*
Lub można użyć tego kodu do kompilacji biblioteki do kodu bajtowego.
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)
zajrzyj na ☞ docs.python.org, aby uzyskać szczegółową dokumentację
źródło