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):
...
Odpowiedzi:
Możesz użyć compileallw 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 .
-Oflagę kompilacji kodu bajtowego (plik .pyo iso .pyc).
compileallfolderze z pakietami witryn i wszystko zepsuł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")
__pycache__/file.cpython-32.pyci otrzymasz to jako wartość zwracaną.
Znalazłem kilka sposobów kompilacji skryptów Pythona do kodu bajtowego
Korzystanie py_compilew terminalu:
python -m py_compile File1.py File2.py File3.py ...
-m określa nazwy modułów do skompilowania.
Lub do interaktywnej kompilacji plików
python -m py_compile -
File1.py
File2.py
File3.py
.
.
.
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:
py_compilei compileallNIE py_compile.pylub compileall.py. Innymi słowy, powinno to być python3 -m py_compile PYTHON_FILENAMElub python3 -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.
compileallnie zawiera logiki do pomijania plików, dla których odpowiadający im .pycplik jest już aktualny, prawda?
compileallpomija pliki, które są już aktualne .pyc(testowane z Pythonem 2.7.11)
python -m compileall <pythonic-project-name>
który kompiluje wszystkie .pypliki do .pycplików w projekcie, który zawiera zarówno pakiety, jak i moduły.
python3 -m compileall <pythonic-project-name>
który kompiluje wszystkie .pypliki do __pycache__folderów w projekcie, który zawiera zarówno pakiety, jak i moduły.
Lub z brązowieniem z tego posta :
Możesz wymusić ten sam układ
.pycplików w folderach, co w Python2, używając:
python3 -m compileall -b <pythonic-project-name>Opcja
-bwyzwala wyjście.pycplików do ich starszych lokalizacji (tj. Takich samych jak w Pythonie2).
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ę