왜 파이와 파이가 아닌 파이입니까?


8

파이썬 deb 패키지를 설치할 때 python-numpy파일이 일반 파이썬 파일이라고 가정하십시오. 패키지 관리자에게 실제로 pyc 또는 pyo 파일을 사용하겠다고 어떻게 말합니까?

답변:


12

이미 가지고 있고 이미 사용하고 있습니다

잘 패키지 된 Python 응용 프로그램은 .pyc파일 설치가 완료된 후 스크립트 실행 으로 파일 로 컴파일됩니다 . 이는 현재 사용중인 Python 설치에 적용 할 수 있도록 패키징 지침에 따라 필요합니다. 그 기억하십니까 .pyc파일 (파이썬 버전 및 종속성) 시스템에 매우 다릅니다.

따라서 Lintian 은 모든 파일 .pyo.pyc파일을 패키지에서 제외 하고 오류로 태그를 지정합니다 .

컴파일 된 파이썬 소스 파일은 패키지에 포함되지 않아야합니다. 이 파일들은 패키지에서 제거되고 postinst에서 패키지 설치시 작성되어야합니다.

자세한 내용은 데비안 파이썬 정책 섹션 2.6 ( 모듈 바이트 컴파일 )을 참조하십시오.

심각도 : 심각성, 확실성 : 특정

의 경우 python-numpy이 설치 후 바이트 컴파일 pycentral의 debhelper 후크에 의해 처리됩니다. 설치 후 다음과 같습니다.

ls -l /usr/lib/python2.7/dist-packages/numpy
lrwxrwxrwx  1 root root     47 Mar 20  2012 add_newdocs.py -> ../../../../share/pyshared/numpy/add_newdocs.py
-rw-r--r--  1 root root 251912 Aug  6 22:06 add_newdocs.pyc

더 많은 배경 정보

예상대로 첫 번째 응용 프로그램 시작 중에 이러한 .pyc/ .pyo파일이 런타임에 컴파일되지 않는 이유 는 다음과 같습니다.

Python 파일은 시스템 전체 디렉토리에 설치되며 시스템의 모든 사용자가 사용할 수 있습니다. 사용자가 응용 프로그램을 시작할 때마다 Python 인터프리터는 .py파일을 읽을 수는 있지만 디렉토리에 쓸 수는 없습니다 (예 :) /usr/lib/python2.7/dist-packages/. 이것은 모든 Linux 시스템에서 일반적인 보안의 일부입니다. 사용자는에 쓸 수 없으며 /usr루트 권한 만 있으면 가능합니다. 이러한 이유로 APT 후크는 설치시 Python 파일을 컴파일합니다. 첫째, 패키지 크기를 최소화하기 위해, 둘째로 파이썬과 관련하여 시스템에서 무언가가 변경되면 후크를 다시 트리거 할 수 있습니다. 예를 들어 업그레이드 중에 호환되지 않을 때 다시 컴파일해야하기 때문입니다.

그러나 이것은 런타임에 컴파일되는 일반 사용자 소유의 파이썬 파일에는 영향을 미치지 않습니다.


/usr/share/pyshared/python이 첫 번째 실행에서 파일을 컴파일 할 수 있도록하려면 쓰기가 가능 해야 합니다.
Adobe

4
@Adobe 무엇? 아니! 이러한 시스템 디렉토리를 사용자가 쓸 수있게 만들지 마십시오. 귀하의 패키지 관리가 이미 귀하를 위해 컴파일했습니다 (내 답변에서 말하려는 내용에 따라). 이제 더 명확하게 업데이트되었습니다.
gertvdijk

당신은 지금-방금 살펴 보았습니다 /usr/lib/python2.7/dist-packages/numpy- pyc파일 들이 있습니다. 나는 몇 가지 설치를 보았고 평범한 py 파일 만 있다는 것을 기억합니다. 그래서 저는 일종의 "버그를 재현 할 수 없습니다".
Adobe

.pyc아직 존재하지 않는 유일한 이유 는 패키지가 완전히 설치되지 않았기 때문입니다. 포장을 푼 후에는 다른 단계를 수행해야합니다. IIRC python-central hook은 모든 패키지가 설치된 후에 만 ​​실행됩니다. 따라서 패키지를 설치하는 실행 중이거나 중단 된 APT 세션에서 설명한 관찰을 수행 할 수 있습니다.
gertvdijk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.