.Py dosyasından bir .pyc dosyasını manuel olarak nasıl oluşturabilirim


128

Bazı nedenlerden dolayı, otomatik olarak .pyc dosyası oluşturmak için Python'un "import" ifadesine güvenemiyorum

Aşağıdaki gibi bir işlevi uygulamanın bir yolu var mı?

def py_to_pyc(py_filepath, pyc_filepath):
    ...

Yanıtlar:


241

compileallTerminalde kullanabilirsiniz . Aşağıdaki komut özyinelemeli olarak alt dizinlere gidecek ve bulduğu tüm python dosyaları için pyc dosyaları oluşturacaktır. Compileall Kullanmaya şey fazladan yüklemeye gerek kalmaz modül, piton standart kütüphanenin bir parçasıdır. Bu, python2 ve python3 için tamamen aynı şekilde çalışır.

python -m compileall .

4
Kabul edilen cevap bu olmalı - en azından tüm *
.py'yi

1
Kullanılan tüm kitaplıkları içeren bir PYC dosyasını dağıtmak mümkün müdür? Yani kullanıcıların bunları yüklemesi gerekmiyor, sadece PYC dosyasını çalıştırdı, java'da bunun JAR kullanarak mümkün olduğunu biliyorum Python için benzer bir yöntem var mı?
D. Snap

Python'daki meta dosyalar hakkında da bir şeyler duydum. Bu derleme de biraz önbellek oluşturuyor mu? Değilse, bunun için komut nedir? Son kullanıcıların lib dizinine yazma izni olmadığı için. Ve burada işleri hızlandırmak istiyorum ... PS. -Obayt kodu (.pyo dosyası iso .pyc) derlemesi için bayrağa da bakın .
danger89

geri derlemeye ne dersiniz?
Sajuuk

1
bu komuta dikkat edin. Yanlışlıkla compileallsite paketleri klasörümde bir yaptım ve bu her şeyi mahvetti
Alex

58

Tek tek dosyaları komut satırından şu şekilde derleyebilirsiniz:

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

55

Python'u en son kullandığımdan bu yana uzun zaman geçti, ancak şunu kullanabileceğine inanıyorum py_compile:

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

8
Muhtemelen çıktı dosyasını belirleyen ikinci parametreyi dahil etmek istersiniz. Aksi takdirde, bu gibi bir şeye varsayılan olur __pycache__/file.cpython-32.pycve bunu dönüş değeri olarak alırsınız.
rvighne

46

Python komut dosyalarını bayt koduna derlemenin birkaç yolunu buldum

  1. py_compileTerminalde kullanma :

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

    -m derlenecek modüllerin adını belirtir.

    Veya dosyaların etkileşimli derlenmesi için

    python -m py_compile -
    File1.py
    File2.py
    File3.py
       .
       .
       .
  2. Kullanarak py_compile.compile:

    import py_compile
    py_compile.compile('YourFileName.py')
  3. Kullanarak py_compile.main():

    Aynı anda birkaç dosya derler.

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

    Liste istediğiniz kadar büyüyebilir. Alternatif olarak, ana dosya listelerini ve hatta komut satırı bağımsız değişkenlerindeki dosya adlarını iletebilirsiniz.

    Veya, ['-']ana olarak geçerseniz, dosyaları etkileşimli olarak derleyebilir.

  4. Kullanarak compileall.compile_dir():

    import compileall
    compileall.compile_dir(direname)

    Verilen dizinde bulunan her bir Python dosyasını derler.

  5. Kullanarak compileall.compile_file():

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

Aşağıdaki bağlantılara bir göz atın:

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

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


Bir küçük düzeltme Eğer yükleme olan modül adı olmasıdır py_compileve compileallDEĞİL py_compile.pyya compileall.py. Başka bir deyişle, python3 -m py_compile PYTHON_FILENAMEveya olmalıdır python3 -m compileall PYTHON_FILES_DIRECTORY.
Devy

17

Compileall kullanırdım . Hem komut dosyalarından hem de komut satırından iyi çalışır. Dahili olarak kullandığı daha önce bahsedilen py_compile'den biraz daha yüksek seviyeli bir modül / araçtır .


compileallkarşılık gelen .pycdosyanın zaten güncel olduğu dosyaları atlama mantığını içermiyor, değil mi?
Kyle Strand

2
@KyleStrand compileallzaten güncel olan dosyaları atlıyor .pyc(Python 2.7.11 ile test edildi)
Eponymous

@Eponymous İlginç. Neden başka türlü düşündüğümden emin değilim. Kontrol ettiğin için teşekkürler.
Kyle Strand

6

Python2'de şunları kullanabilirsiniz:

python -m compileall <pythonic-project-name>

hangi markaları tüm derlemek .pyiçin .pycalt klasörler bulunan projede.


Python3'te şunları kullanabilirsiniz:

python3 -m compileall <pythonic-project-name>

hangi markaları tüm derlemek .pyiçin __pycache__alt klasörler bulunan projede klasörler.

Veya bu yazıdaki kızarma ile :

.pycKlasörlerde Python2'de olduğu gibi aynı dosya düzenini aşağıdakileri kullanarak uygulayabilirsiniz :

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

Seçenek dosyaların -bçıktısını .pyceski konumlarına tetikler (yani Python2'deki ile aynı).


3

Orijinal soru gereksinimlerini (kaynak yolu ve hedef yol) eşleştirmek için kod şu şekilde olmalıdır:

import py_compile
py_compile.compile(py_filepath, pyc_filepath)

Girdi kodunda hatalar varsa, py_compile.PyCompileError istisnası ortaya çıkar.


1

Bunu yapmanın iki yolu var

  1. Komut satırı
  2. Python programını kullanma

Komut satırı kullanıyorsanız python -m compileall <argument>, python kodunu python ikili koduna derlemek için kullanın . Ör:python -m compileall -x ./*

Veya kitaplığınızı bayt koduna derlemek için bu kodu kullanabilirsiniz.

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)

bakmak ☞ docs.python.org için ayrıntılı belgeler

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.