답변:
PyInstaller 는 종속성이없는 단일 .exe 파일을 만듭니다. --onefile
옵션을 사용하십시오 . 필요한 모든 공유 라이브러리를 실행 파일로 압축하고 실행하기 전에 압축을 풉니 다 (편집 : py2exe 에도이 기능이 있습니다. minty의 답변 참조 )
최신 릴리스 (1.3)가 다소 구식이기 때문에 svn의 PyInstaller 버전을 사용합니다. PyQt, PyQwt, numpy, scipy 등에 의존하는 앱에서 실제로 잘 작동하고 있습니다.
py2exe를 사용하여이를 수행하는 방법은 setup.py 파일에서 bundle_files 옵션을 사용하는 것입니다. 단일 파일의 경우 bundle_files
1, compressed
True로 설정하고 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,
)
windows = [{'script': "single.py"}]
로 console = ['single.py']
그래서 윈도우에서 CMD 창에서 열 것 파일을 두 번 클릭.
다른 포스터에서 언급했듯이 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!")
모든 질문은 자유롭게했다.
\'file_resources': [('txt2.txt')]
하면 오류가 발생합니다 (내 .exe에 포함하려는 파일 이름은 txt2이며 .txt 파일입니다) )
앞에서 언급 한대로 설치 관리자를 만들어야합니다. py2exe가 bundle_files 옵션을 1로 설정하고 zipfile 키워드 인수를 None으로 설정하여 모든 것을 단일 실행 파일로 묶는 것도 가능하지만 PyGTK 응용 프로그램에는 권장하지 않습니다.
GTK +가 데이터 파일 (로컬, 테마 등)을로드 한 디렉토리에서로드하려고하기 때문입니다. 따라서 실행 파일 디렉토리에 GTK +가 사용하는 라이브러리와 GTK + 설치의 lib, share 등 디렉토리가 포함되어 있는지 확인해야합니다. 그렇지 않으면 GTK +가 시스템 전체에 설치되어 있지 않은 컴퓨터에서 응용 프로그램을 실행하는 데 문제가 발생합니다.
자세한 내용 은 PyGTK 응용 프로그램에 대한 py2exe 가이드를 읽으십시오 . GTK +를 제외한 모든 것을 묶는 방법도 설명합니다.
c_x freeze를 사용해보십시오 . 좋은 독립형을 만들 수 있습니다.
최근에 py2exe를 사용하여 ReviewBoard에 리뷰를 보내기위한 검토 후 실행 파일을 만들었습니다.
이것은 내가 사용한 setup.py였습니다.
from distutils.core import setup
import py2exe
setup(console=['post-review'])
exe 파일과 필요한 라이브러리를 포함하는 디렉토리를 작성했습니다. py2exe를 사용하여 단일 .exe 파일을 얻는 것이 가능하지 않다고 생각합니다. 필요한 경우 먼저 py2exe를 사용한 다음 설치 관리자를 사용하여 최종 실행 파일을 만들어야합니다.
주의해야 할 사항은 응용 프로그램에서 사용하는 계란 파일의 압축을 풀어야한다는 것입니다. 이것은 py2exe 문서에서 다룹니다.
아니요, 나중에 하나의 파일 만 가지고 있다는 의미에서 단일 실행 파일을 제공하지는 않지만 exe 파일을 포함하여 프로그램을 실행하는 데 필요한 모든 것을 포함하는 디렉토리가 있습니다.
방금 오늘 이 setup.py를 썼습니다 . 호출 만하면 python setup.py py2exe
됩니다.