[python] py2exe-단일 실행 파일 생성

py2exe 가이 작업을 수행 할 수 있다고 들었지만 생각 하지 못했습니다. 누구든지 이것을 성공적으로 했습니까? setup.py 파일과 사용한 명령 줄 옵션을 볼 수 있습니까?

기본적으로 나는 압축을 풀거나 / temp로 실행하는 것과 같은 것을 수행하는 단일 실행 파일을 제공한다고 생각합니다.



답변

PyInstaller 는 종속성이없는 단일 .exe 파일을 만듭니다. --onefile옵션을 사용하십시오 . 필요한 모든 공유 라이브러리를 실행 파일로 압축하고 실행하기 전에 압축을 풉니 다 (편집 : py2exe 에도이 기능이 있습니다. minty의 답변 참조 )

최신 릴리스 (1.3)가 다소 구식이기 때문에 svn의 PyInstaller 버전을 사용합니다. PyQt, PyQwt, numpy, scipy 등에 의존하는 앱에서 실제로 잘 작동하고 있습니다.


답변

py2exe를 사용하여이를 수행하는 방법은 setup.py 파일에서 bundle_files 옵션을 사용하는 것입니다. 단일 파일의 경우 bundle_files1, compressedTrue로 설정하고 zipfile 옵션을 없음으로 설정하려고합니다. 그렇게하면 쉽게 배포 할 수 있도록 하나의 압축 파일이 만들어집니다.

여기에서 직접 인용 한 bundle_file 옵션에 대한 자세한 설명입니다 py2exe에 사이트 *

“bundle_files”및 “zipfile”사용

단일 파일 실행 파일을 작성하는보다 쉬운 방법은 bundle_files를 1 또는 2로 설정하고 zipfile을 없음으로 설정하는 것입니다. 이 방법을 사용하면 파일을 임시 위치로 추출 할 필요가 없으므로 훨씬 빠른 프로그램 시작이 가능합니다.

bundle_files에 유효한 값은 다음과 같습니다.

  • 3 (기본)은 묶지 않습니다
  • 2 파이썬 인터프리터를 제외한 모든 것을 묶습니다.
  • 1 파이썬 인터프리터를 포함한 모든 번들

zipfile이 없음으로 설정되면 파일은 library.zip 대신 실행 파일 내에 번들됩니다.

다음은 샘플 setup.py입니다.

from distutils.core import setup
import py2exe, sys, os

sys.argv.append('py2exe')

setup(
    options = {'py2exe': {'bundle_files': 1, 'compressed': True}},
    windows = [{'script': "single.py"}],
    zipfile = None,
)


답변

다른 포스터에서 언급했듯이 py2exe는 실행 파일과로드 할 일부 라이브러리를 생성합니다. 프로그램에 추가 할 데이터가있을 수도 있습니다.

다음 단계는 설치 프로그램을 사용하여이 모든 것을 사용하기 쉬운 설치 가능 / 해제 불가능한 프로그램으로 패키지화하는 것입니다.

나는 InnoSetup ( http://www.jrsoftware.org/isinfo.php )을 몇 년 동안이나 상업적인 프로그램으로 즐겁게 사용 했기 때문에 진심으로 추천합니다.


답변

exe에 모든 리소스가 포함 된 단일 exe 파일을 만들 수있었습니다. 나는 창문에 건물입니다. 그래서 내가 사용하는 os.system 호출 중 일부를 설명합니다.

먼저 모든 이미지를 비트 매트로 변환 한 다음 모든 데이터 파일을 텍스트 문자열로 변환하려고했습니다. 그러나 이로 인해 최종 exe가 매우 커졌습니다.

일주일 동안 googleing 한 후 py2exe 스크립트를 변경하여 내 요구를 충족시키는 방법을 알아 냈습니다.

다음은 제출 한 sourceforge의 패치 링크입니다. 다음 배포에 포함시킬 수 있도록 의견을 게시하십시오.

http://sourceforge.net/tracker/index.php?func=detail&aid=3334760&group_id=15583&atid=315583

이 모든 변경 사항을 explanes, 난 단순히 설정 옵션에 새로운 옵션을 추가했습니다. 여기 내 setup.py입니다.

최선을 다해 의견을 말하려고합니다. 내 setup.py는 파일 이름으로 이미지에 액세스한다는 사실에 복잡합니다. 추적하기 위해 목록을 저장해야합니다.

이것은 내가 만들고 싶었던 B 화면 보호기의 것입니다.

exec를 사용하여 런타임에 설정을 생성하면 잘라 내기 쉽고 붙여 넣기가 쉽습니다.

exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\
      'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\
      options={'py2exe': py2exe_options},\
      zipfile = None )" % (bitmap_string[:-1])

고장

스크립트 = py 스크립트 exe로 바꾸고 싶습니다

icon_resources = exe 아이콘

file_resources = exe에 포함시키고 싶은 파일

other_resources = exe에 포함 할 문자열 (이 경우 파일 목록)

options = 하나의 exe 파일로 모든 것을 만들기위한 py2exe 옵션

bitmap_strings = 포함 할 파일 목록

위의 링크에 설명 된대로 py2exe.py 파일을 편집 할 때까지 file_resources는 유효한 옵션이 아닙니다.

처음 으로이 사이트에 코드를 게시하려고 시도했을 때 잘못되면 화를 내지 마십시오.

from distutils.core import setup
import py2exe #@UnusedImport
import os

#delete the old build drive
os.system("rmdir /s /q dist")

#setup my option for single file output
py2exe_options = dict( ascii=True,  # Exclude encodings
                       excludes=['_ssl',  # Exclude _ssl
                                 'pyreadline', 'difflib', 'doctest', 'locale',
                                 'optparse', 'pickle', 'calendar', 'pbd', 'unittest', 'inspect'],  # Exclude standard library
                       dll_excludes=['msvcr71.dll', 'w9xpopen.exe',
                                     'API-MS-Win-Core-LocalRegistry-L1-1-0.dll',
                                     'API-MS-Win-Core-ProcessThreads-L1-1-0.dll',
                                     'API-MS-Win-Security-Base-L1-1-0.dll',
                                     'KERNELBASE.dll',
                                     'POWRPROF.dll',
                                     ],
                       #compressed=None,  # Compress library.zip
                       bundle_files = 1,
                       optimize = 2
                       )

#storage for the images
bitmap_string = ''
resource_string = ''
index = 0

print "compile image list"

for image_name in os.listdir('images/'):
    if image_name.endswith('.jpg'):
        bitmap_string += "( " + str(index+1) + "," + "'" + 'images/' + image_name + "'),"
        resource_string += image_name + " "
        index += 1

print "Starting build\n"

exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\
      'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\
      options={'py2exe': py2exe_options},\
      zipfile = None )" % (bitmap_string[:-1])

print "Removing Trash"
os.system("rmdir /s /q build")
os.system("del /q *.pyc")
print "Build Complete"

좋아, 그것은 setup.py를 위해 이제 마법이 이미지에 액세스하는 데 필요했습니다. py2exe를 염두에 두지 않고이 응용 프로그램을 개발 한 다음 나중에 추가했습니다. 두 상황 모두에 액세스 할 수 있습니다. 이미지 폴더를 찾을 수 없으면 exe 리소스에서 이미지를 가져 오려고 시도합니다. 코드가 그것을 설명 할 것입니다. 이것은 내 스프라이트 클래스의 일부이며 directx를 사용합니다. 원하는 API를 사용하거나 원시 데이터에 액세스 할 수 있습니다. 중요하지 않습니다.

def init(self):
    frame = self.env.frame
    use_resource_builtin = True
    if os.path.isdir(SPRITES_FOLDER):
        use_resource_builtin = False
    else:
        image_list = LoadResource(0, u'INDEX', 1).split(' ')

    for (model, file) in SPRITES.items():
        texture = POINTER(IDirect3DTexture9)()
        if use_resource_builtin:
            data = LoadResource(0, win32con.RT_RCDATA, image_list.index(file)+1) #windll.kernel32.FindResourceW(hmod,typersc,idrsc)               
            d3dxdll.D3DXCreateTextureFromFileInMemory(frame.device,   #Pointer to an IDirect3DDevice9 interface
                                              data,                #Pointer to the file in memory
                                              len(data),           #Size of the file in memory
                                              byref(texture))      #ppTexture
        else:
            d3dxdll.D3DXCreateTextureFromFileA(frame.device, #@UndefinedVariable
                                               SPRITES_FOLDER + file,
                                               byref(texture))
        self.model_sprites[model] = texture
    #else:
    #    raise Exception("'sprites' folder is not present!")

모든 질문은 자유롭게했다.


답변

앞에서 언급 한대로 설치 관리자를 만들어야합니다. py2exe가 bundle_files 옵션을 1로 설정하고 zipfile 키워드 인수를 None으로 설정하여 모든 것을 단일 실행 파일로 묶는 것도 가능하지만 PyGTK 응용 프로그램에는 권장하지 않습니다.

GTK +가 데이터 파일 (로컬, 테마 등)을로드 한 디렉토리에서로드하려고하기 때문입니다. 따라서 실행 파일 디렉토리에 GTK +가 사용하는 라이브러리와 GTK + 설치의 lib, share 등 디렉토리가 포함되어 있는지 확인해야합니다. 그렇지 않으면 GTK +가 시스템 전체에 설치되어 있지 않은 컴퓨터에서 응용 프로그램을 실행하는 데 문제가 발생합니다.

자세한 내용 은 PyGTK 응용 프로그램에 대한 py2exe 가이드를 읽으십시오 . GTK +를 제외한 모든 것을 묶는 방법도 설명합니다.


답변

bbfreeze 는 단일 파일 .EXE를 만들 것이며 py2exe보다 최신 이라고 들었 습니다.


답변

c_x freeze를 사용해보십시오

. 좋은 독립형을 만들 수 있습니다.