py2exe-단일 실행 파일 생성


141

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

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


이것은 파이썬 3 또는 파이썬 2 이후 버전에 적용됩니까?
Vincent

답변:


105

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

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


5
계란을 사용할 때 py2exe가 pyInstaller보다 훨씬 잘 작동한다는 것을 알았습니다. 민트의 대답은 해결책입니다.
gbjbaanb

1.4 버전부터 PyInstaller는 Windows에서 Python 2.6 이상을 지원하지 않습니다.
Joril

2
현재 버전 1.5.1을 사용하고 있으며 Python 2.7.2에서 작동합니다.
oob

1
컴파일러 프로그램에서 몇 개의 인수를 지정하면 py2exe가 단일 파일 실행 파일을 작성할 수 있습니다. py2exe에는 온라인으로 단일 파일 실행 파일에 대한 자습서가 있습니다.
trevorKirkby

2
객관적인 견해 : py2exe로 단일 exe 파일을 만드는 문제를 다루지 않기 때문에 이것이 어떻게 대답 할 수 있는지 알지 못합니다. 그럼에도 불구하고 이것은 유용한 답변입니다.
Jonathan Komar

171

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,
)

5
인터프리터 만 번들로 제공하지 않으려면 bundle_files 옵션으로 2를 선택하십시오. 행운을 빕니다!
minty

13
bundle_files 1은 amd64 (파이썬 2.6의 경우 py2exe 0.6.9 이상)에서 지원되지 않습니다.
Joril

2
@Pat : py2exe를 실행하기위한 호출은 "python setup.py py2exe"입니다. 끝에 "py2exe"를 자동으로 추가하면 명령 줄에 입력 할 필요가 없습니다.
orlade

2
Microsoft Visual C 런타임 DLL설치 해야하므로 정확히 하나의 실행 파일이 아닙니다 .
케빈 스미스

2
단일 실행 파일로 갖고 싶은 콘솔 응용 프로그램이 있습니다. 나는 대체했다 windows = [{'script': "single.py"}]console = ['single.py']그래서 윈도우에서 CMD 창에서 열 것 파일을 두 번 클릭.
Jeff B

13

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

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

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


py2exe 이후에도 패키지 할 항목이 있음을 나타내는 +1
joaquin

6

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!")

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


나는 당신의 방법을 시도했지만 잘 작동하지만 옵션 파일에 file_resurces 옵션을 추가하여 일부 파일을 .exe에 넣는 방법을 이해하지 못했습니다. 내가 말한대로 build_exe.py 파일을 수정했지만 setup.py 파일로 이동 \'file_resources': [('txt2.txt')]하면 오류가 발생합니다 (내 .exe에 포함하려는 파일 이름은 txt2이며 .txt 파일입니다) )
VinceLomba

모든 이미지를 비트 매트로 변환 한 다음 모든 데이터 파일을 텍스트 문자열로 변환하는 방법에 대해 설명했습니다. exe를 크게 만든다고 말했지만이 작업이 가능합니까? 그렇다면 어떻게하는지 알려주십시오. 나는이 대답이 꽤 오래되었다는 것을 알고 있지만 대답 할 수 있다면 감사하겠습니다.
Peppa

4

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

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

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


1

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


3
내가 이해할 수있는 한 bbfreeze는 단일 파일 실행 파일을 생성하지 않습니다. 답을 기록해 주시겠습니까?
joaquin

-1

c_x freeze를 사용해보십시오 . 좋은 독립형을 만들 수 있습니다.


나 cx_Freeze는 사실에 나 cx_Freeze에 대한 문서, 독립 실행 파일을 만들 수 없습니다 buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/...는 말한다, "나 cx_Freeze 어디, 모든 단일 파일 EXE를 구축 지원하지 않습니다 "응용 프로그램 라이브러리가 하나의 실행 파일에 포함되어 있습니다." cx_Freeze의 독립형 실행 파일에 대한 자세한 내용은 설명서 ( buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/… )로 이동하여 섹션 4.5로 이동하십시오.
Peppa

-2

최근에 py2exe를 사용하여 ReviewBoard에 리뷰를 보내기위한 검토 후 실행 파일을 만들었습니다.

이것은 내가 사용한 setup.py였습니다.

from distutils.core import setup
import py2exe

setup(console=['post-review'])

exe 파일과 필요한 라이브러리를 포함하는 디렉토리를 작성했습니다. py2exe를 사용하여 단일 .exe 파일을 얻는 것이 가능하지 않다고 생각합니다. 필요한 경우 먼저 py2exe를 사용한 다음 설치 관리자를 사용하여 최종 실행 파일을 만들어야합니다.

주의해야 할 사항은 응용 프로그램에서 사용하는 계란 파일의 압축을 풀어야한다는 것입니다. 이것은 py2exe 문서에서 다룹니다.


-6

아니요, 나중에 하나의 파일 만 가지고 있다는 의미에서 단일 실행 파일을 제공하지는 않지만 exe 파일을 포함하여 프로그램을 실행하는 데 필요한 모든 것을 포함하는 디렉토리가 있습니다.

방금 오늘 이 setup.py를 썼습니다 . 호출 만하면 python setup.py py2exe됩니다.


1
이것은 정확하지 않습니다. 올바른 옵션을 사용하면 하나의 독립형 파일을 얻을 수 있습니다.
trevorKirkby

@ Torsten Marek ... setup.py에 대한 링크가 죽었습니다. 특히 .. 처음 2 개의 재발견은 상업적인 것들을 홍보하는 결과를 가져옵니다. 인터넷의 막 다른 에서 세 번째로 끝납니다 .
ZF007
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.