.py 파일에서 .pyc 파일을 수동으로 생성하는 방법


128

어떤 이유로 든 파이썬의 "import"문에 의존하여 .pyc 파일을 자동으로 생성 할 수는 없습니다.

다음과 같이 함수를 구현하는 방법이 있습니까?

def py_to_pyc(py_filepath, pyc_filepath):
    ...

답변:


241

compileall터미널에서 사용할 수 있습니다 . 다음 명령은 하위 디렉토리로 재귀 적으로 이동하여 찾은 모든 파이썬 파일에 대해 pyc 파일을 만듭니다. compileall의 당신이 그것을 사용하는 것이 아무것도 추가를 설치할 필요가 없습니다 모듈은 파이썬 표준 라이브러리의 일부입니다. 이것은 python2와 python3과 동일하게 작동합니다.

python -m compileall .

4
이것은 최소한 * .py를 * .pyc : recursively :)로 컴파일해야 할 필요가있는 대답입니다.
swdev

1
사용 된 모든 라이브러리를 포함하는 PYC 파일을 배포 할 수 있습니까? 따라서 사용자는 설치하지 않아도 PYC 파일을 실행했습니다 .Java에서 JAR을 사용하여 가능하다는 것을 알고 있습니다. 파이썬에 비슷한 방법이 있습니까?
D.Snap

파이썬에서 메타 파일에 대해서도 들었습니다. 이 compileall도 캐시를 작성합니까? 그렇지 않다면, 그 명령은 무엇입니까 ?? 최종 사용자에게는 lib 디렉토리에 대한 쓰기 권한이 없습니다. 그리고 나는 여기서 속도를 내고 싶다. PS. 또한 -O바이트 코드 (.pyo 파일 iso .pyc) 컴파일 에 대한 플래그를 살펴보십시오 .
danger89

디 컴파일은 어떻습니까?
사주

1
이 명령에주의하십시오. 실수로 compileall내 사이트 패키지 폴더에서 작업을 수행하여 모든 것을 망쳤습니다.
Alex

58

명령 줄에서 다음을 사용하여 개별 파일을 컴파일 할 수 있습니다.

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

55

마지막으로 Python을 사용한 지 얼마되지 않았지만 사용할 수 있다고 생각합니다 py_compile.

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

8
출력 파일을 결정하는 두 번째 매개 변수를 포함하려고합니다. 그렇지 않으면 기본값이 비슷한 __pycache__/file.cpython-32.pyc것으로 반환 값으로 얻습니다.
rvighne

46

파이썬 스크립트를 바이트 코드로 컴파일하는 가지 방법을 찾았 습니다.

  1. py_compile터미널에서 사용 :

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

    -m 컴파일 할 모듈 이름을 지정합니다.

    또는 대화식 파일 컴파일

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

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

    한 번에 여러 파일을 컴파일합니다.

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

    원하는만큼 목록이 커질 수 있습니다. 또는 명령 줄 args에서 기본 또는 파일 이름의 파일 목록을 전달할 수 있습니다.

    또는 ['-']main을 전달하면 대화식으로 파일을 컴파일 할 수 있습니다.

  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


하나의 작은 수정은로드되는 모듈 이름이 있다는 것입니다 py_compilecompileallNOT py_compile.pycompileall.py. 즉, python3 -m py_compile PYTHON_FILENAME또는 이어야합니다 python3 -m compileall PYTHON_FILES_DIRECTORY.
Devy

17

compileall 사용 합니다 . 스크립트와 명령 줄에서 잘 작동합니다. 이미 언급 한 py_compile 보다 약간 높은 수준의 모듈 / 도구 이므로 내부에서도 사용됩니다.


compileall해당 .pyc파일이 이미 최신 상태 인 파일 을 건너 뛰는 논리를 포함 하지 않습니까?
Kyle Strand

2
@KyleStrand compileall는 이미 최신 버전 .pyc(Python 2.7.11에서 테스트)을 가진 파일을 건너 뜁니다.
Eponymous

@ 유명한 흥미. 왜 내가 다르게 생각했는지 모르겠습니다. 확인해 주셔서 감사합니다.
Kyle Strand

6

Python2에서는 다음을 사용할 수 있습니다.

python -m compileall <pythonic-project-name>

어떤 차종 모두 컴파일 .py.pyc하위 폴더를 포함 프로젝트에.


Python3에서는 다음을 사용할 수 있습니다.

python3 -m compileall <pythonic-project-name>

모든 컴파일 .py__pycache__하위 폴더가 포함 된 프로젝트 폴더로 .

또는 이 게시물 에서 브라우닝으로 :

.pyc다음을 사용하여 Python2 와 동일한 폴더 에 파일 레이아웃을 적용 할 수 있습니다 .

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

이 옵션 -b.pyc파일을 기존 위치로 출력 합니다 (예 : Python2와 동일).


3

원래 질문 요구 사항 (소스 경로 및 대상 경로)을 일치 시키려면 코드는 다음과 같아야합니다.

import py_compile
py_compile.compile(py_filepath, pyc_filepath)

입력 코드에 오류가 있으면 py_compile.PyCompileError 예외가 발생합니다.


1

이 작업을 수행하는 두 가지 방법이 있습니다

  1. 커맨드 라인
  2. 파이썬 프로그램 사용하기

명령 행을 사용 python -m compileall <argument>하는 경우 파이썬 코드를 파이썬 이진 코드로 컴파일하십시오. 전의: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 를 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.