py2exe 가이 작업을 수행 할 수 있다고 들었지만 생각 하지 못했습니다. 누구든지 이것을 성공적으로 했습니까? setup.py 파일과 사용한 명령 줄 옵션을 볼 수 있습니까?
기본적으로 나는 압축을 풀거나 / temp로 실행하는 것과 같은 것을 수행하는 단일 실행 파일을 제공한다고 생각합니다.
답변
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,
)
답변
다른 포스터에서 언급했듯이 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 +를 제외한 모든 것을 묶는 방법도 설명합니다.