2013-01-22 2 views
6

pyinstaller로 빌드 된 실행 파일에 대해 적용 범위를 달리 할 수 ​​있습니까? 파이썬 스크립트처럼 실행 해 보았습니다. 실행 파일과 같은 입력 파일을 사용하지 못했습니다. (실제로 작동하지 않을 것으로 기대됩니다.) 그리고 빌드 된 실행 파일에 대해 실행 가능한 쉬운 방법이 없다고 생각됩니다. .... '고정 실행 파일의 적용 범위

은 내가 사용하고 커버리지 패키지는 nedbatchelder.com (http://nedbatchelder.com/code/coverage/)

+0

실행 파일에 구워지지 않은 파이썬 스크립트에 어떤 코드 적용 도구를 사용합니까? – selbie

+0

해당 정보가 포함되도록 편집 됨 –

+1

적용 범위를 테스트 하시겠습니까? 당신은 그 범위를 넘어 설 수있는 고정되지 않은 스크립트에 액세스 할 수 있습니까? –

답변

6

이 ISN에서 "easy_install을 적용"을 얻으려면, 정상 범위 패키지 (이 창은 .exe를에) t 공식화 된 답변이지만 지금까지 내가 찾은 것.

pyinstaller가 작동하는 방식을 잘 알고있는 한, 파이썬 인터프리터를 내장하고 스크립트를로드하는 부트 스트랩 (bootstraps)을 수행하는 작은 C 프로그램에서 이진 파일을 생성한다는 점에서입니다. PyInstaller는 EXE를 구성하여 파이썬 코드에 대한 리소스를 포함하고있는 실제 바이너리의 끝에 아카이브를 포함합니다. 이에 대해서는 여기 http://www.pyinstaller.org/export/develop/project/doc/Manual.html#pyinstaller-archives에서 설명합니다.

Pyinstaller/loader/iu.py Docs의 iu.py가 있습니다. 바이너리에서 가져 오기 훅을 만들 수 있어야합니다. pyinstaller disassembler에 대한 인터넷 검색은 필요한 부분을 추출하는 것처럼 보이는 https://bitbucket.org/Trundle/exetractor/src/00df9ce00e1a/exetractor/pyinstaller.py을 발견했습니다.

이 부분의 다른 부분은 바이너리 아카이브의 모든 리소스가 파이썬 코드로 컴파일된다는 것입니다. 대부분의 경우, coverage.py는 평범한 조건에서 실행될 때 다른 컴파일 된 모듈을 치는 것과 같은 방식으로 도움이되지 않는 출력을 제공합니다.

3

강조 사용 cover_pylib=True

난 당신이 질문을 한 후이가 긴 알고 있지만 난 그냥 대답을 필요로 주위를 얻고있다. :)

coverage.py에 대한 현재 bitbucket 소스를 사용하여 PyInstaller 생성 된 EXE 파일에서 적용 가능한 데이터를 성공적으로 수집 할 수 있습니다. 나는 조건이 같은 범위를 수집을 시작하는 범위를 말해 내 응용 프로그램에 대한 주요 소스에서

: 내가 원하는 때

if os.environ.has_key('COVERAGE') and len(os.environ['COVERAGE']) > 0: 
    usingCoverage = True 
    import coverage 
    import time 
    cov = coverage.coverage(data_file='.coverage.' + version.GetFullString(), data_suffix=time.strftime(".%Y_%m_%d_%H_%M.%S", time.localtime()), cover_pylib=True) 
    cov.start() 

에만 적용 수집을 시작합니다. data_suffix를 사용하면 나중에 커버리지 파일 병합을 위해 cov.combine()을보다 쉽게 ​​사용할 수 있습니다. version.GetFullString()은 내 응용 프로그램 버전 번호입니다.

cover_pylib은 모든 표준 파이썬 라이브러리 모듈 __file__ 속성은 패키지의 내부에 존재하지 않는 다른 코드에서이 ...\_MEIXXXXX\random.pyc 같이보고 (경로 기준) 따라서 구별 할 수 있기 때문에 여기에 True로 설정됩니다.

응용 프로그램이 내가이 작은 조각이 종료 할 준비가

:

if usingCoverage: 
    cov.stop() 
    cov.save() 

내 응용 프로그램이 자동으로 나를 위해 자사의 HTML 보고서를 생성하지 않습니다 아직 coverage.py을 실행 한 후에. 커버리지 데이터는 정리되어 파일 참조가 실제 소스 코드에 대한 절대 파일 경로로 변환되도록 ...\_MEIXXXX\...이 정리되어야합니다.

나는이 코드 조각을 실행하여이 작업을 수행 :

import sys 
import os.path 

from coverage.data import CoverageData 
from coverage import coverage 

from glob import glob 

def cleanupLines(data): 
    """ 
    The coverage data collected via PyInstaller coverage needs the data fixed up 
    so that coverage.py's report generation code can analyze the source code. 
    PyInstaller __file__ attributes on code objecters are all in subdirectories of the  _MEIXXXX 
    temporary subdirectory. We need to replace the _MEIXXXX temp directory prefix with  the correct 
    prefix for each source file. 
    """ 
    prefix = None 
    for file, lines in data.lines.iteritems(): 
     origFile = file 
     if prefix is None: 
      index = file.find('_MEI') 
      if index >= 0: 
       pathSepIndex = file.find('\\', index) 
       if pathSepIndex >= 0: 
        prefix = file[:pathSepIndex + 1] 
     if prefix is not None and file.find(prefix) >= 0: 
      file = file.replace(prefix, "", 1) 
      for path in sys.path: 
       if os.path.exists(path) and os.path.isdir(path): 
        fileName = os.path.join(path, file) 
        if os.path.exists(fileName) and os.path.isfile(fileName): 
         file = fileName 
      if origFile != file: 
       del data.lines[origFile] 
       data.lines[file] = lines 

for file in glob('.coverage.' + version.GetFullString() + '*'): 
    print "Cleaning up: ", file 
    data = CoverageData(file) 
    data.read() 
    cleanupLines(data) 
    data.write() 

(가) 여기에 루프 정리됩니다 결합됩니다 커버리지 모든 파일을 보장하기 위해 전적으로이다.

참고 :이 코드가 기본적으로 정리하지 못하는 유일한 적용 범위 데이터는 관련 파일로 __file__ 특성에 _MEIXXX 데이터를 포함하지 않습니다.

정상적으로 HTML 또는 XML (또는 무엇이든) coverage.py을 성공적으로 생성 할 수 있습니다. 내 경우

그것은 다음과 같습니다

cov = coverage(data_file='.coverage.' + version.GetFullString(), data_suffix='.combined') 
cov.load() 
cov.combine() 
cov.save() 
cov.load() 
cov.html_report(ignore_errors=True,omit=[r'c:\python27\*', r'..\3rdParty\PythonPackages\*']) 

생성자 data_file에의 사용은 부하/제대로 내 청소 범위의 모든 파일을 인식 결합하도록하는 것입니다.

html_report 전화는 coverage.py에 표준 파이썬 라이브러리 (및 내 버전 제어 트리에 체크인 된 Python 라이브러리)를 무시하고 내 응용 프로그램 코드에만 초점을 맞 춥니 다.

이 정보가 도움이되기를 바랍니다.