Pergunta

Eu pensei ter ouvido que py2exe foi capaz de fazer isso, mas eu nunca percebi isso. Alguém já fez isso com sucesso? Eu posso ver seu arquivo setup.py, e quais as opções de linha de comando que você usou?

Basicamente eu estou pensando nisso me dar um único arquivo executável que faz algo como o próprio descompactação para talvez / temp e corre.

Foi útil?

Solução

PyInstaller irá criar um único arquivo .exe sem dependências; usar a opção --onefile. Ele faz isso por embalar as bibliotecas compartilhadas necessárias para o executável, e descompactar-los antes de executar, assim como você descrever (EDIT: py2exe também tem esse recurso, consulte o mentolado resposta )

Eu uso a versão do PyInstaller do SVN, uma vez que a versão mais recente (1.3) é um pouco desatualizado. Ele tem trabalhado muito bem para um aplicativo que depende PyQt, PyQwt, numpy, scipy e mais alguns.

Outras dicas

A maneira de fazer isso usando py2exe é usar a opção bundle_files em seu arquivo setup.py. Para um único arquivo que você vai querer definir bundle_files a 1, compressed como True, e defina a opção zipfile para Nenhum. Dessa forma, ele cria um arquivo compactado para distribuição fácil.

Aqui está uma descrição mais completa da opção bundle_file citou diretamente a partir do py2exe local *

Usando o "bundle_files" e "zipfile"

Uma mais fácil (e melhor) maneira de criar executáveis ??de arquivo único é definir bundle_files a 1 ou 2, e a conjunto zipfile para Nenhum. Esta abordagem faz não requerem extração de arquivos para um local temporária, que fornece muito mais rápido do programa de inicialização.

Os valores válidos para bundle_files são:

  • 3 (padrão) não pacote
  • 2 tudo o pacote, mas o interpretador Python
  • 1 tudo pacote, incluindo o interpretador Python

Se zipfile é definido como Nenhum, os arquivos estarão pacote dentro do executável em vez de library.zip.

Aqui é um setup.py amostra:

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

Como o outro menção cartaz, py2exe, irá gerar um executável + algumas bibliotecas para carregar. Você também pode ter alguns dados para adicionar ao seu programa.

O próximo passo é usar um instalador, para embalar tudo isso em um instalável programa e fácil de usar / unistallable.

Eu tenho usado InnoSetup ( http://www.jrsoftware.org/isinfo.php ) com prazer por vários anos e para programas comerciais, então eu recomendo vivamente.

Você deve criar um instalador, como mencionado antes. Mesmo que também é possível deixar tudo pacote py2exe em um único executável, por opção bundle_files a 1 e o argumento de palavra-chave zipfile a configuração Nenhum, eu não recomendo este para aplicações de PyGTK.

Isso é por causa do GTK + tentativas para carregar seus arquivos de dados (locais, temas, etc.) a partir do diretório que foi carregado a partir. Então você tem que ter certeza de que o diretório do seu executável contém também as bibliotecas usadas pelo GTK + e os diretórios lib, compartilhar e etc a partir de sua instalação do GTK +. Caso contrário, você vai ter problemas ao executar o aplicativo em uma máquina onde GTK + não está instalado em todo o sistema.

Para mais detalhes, leia o meu guia para py2exe para PyGTK aplicações . Ele também explica como empacotar tudo, mas GTK +.

Eu tenho sido capaz de criar um único arquivo exe com todos os recursos embeded no exe. Estou construindo em janelas. de modo que irá explicar algumas das chamadas os.system que estou usando.

Primeiro eu tentei converter todas as minhas imagens em bitmats e depois todos os meus arquivos de dados em cadeias de texto. mas isso fez com que o exe final a ser muito, muito grande.

Depois de googleing por uma semana eu descobri como alterar roteiro py2exe para atender minhas necessidades.

aqui está o link patch no sourceforge i enviado, por favor postar comentários para que possamos obtê-lo incluído no a próxima distribuição.

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

Este explanes todas as alterações feitas, eu tenho simplesmente adicionado uma nova opção para a linha de configuração. aqui é o meu setup.py.

vou tentar comentá-lo da melhor forma possível. Por favor, saibam que o meu setup.py é fazer complexa para o fato de que eu sou o acesso as imagens por nome de arquivo. então eu devo armazenar uma lista de manter o controle deles.

Esta é a partir de uma tela de quero-a-b saver eu estava tentando fazer.

Eu uso exec para gerar a minha configuração em tempo de execução, a sua easyer de cortar e colar assim.

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

quebra

roteiro = script py i querer voltar para um exe

icon_resources = o ícone para o exe

file_resources = arquivos que deseja incorporar no exe

other_resources = uma string para incorporar no exe, neste caso, uma lista de arquivos.

options = Opções py2exe para criar tudo em um arquivo exe

bitmap_strings = uma lista de arquivos para incluir

Por favor note que file_resources não é uma opção válida até que você editar o arquivo py2exe.py conforme descrito no link acima.

primeira vez que eu tentei código postal no site, se eu entendi errado, não me chama.

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"

ok, é isso para o setup.py agora a magia necessária acesso as imagens. Eu desenvolvi este aplicativo sem py2exe em mente, então acrescentou-lo mais tarde. então você verá o acesso para ambas as situações. se a pasta de imagem não pode ser encontrado ele tenta puxar as imagens a partir dos recursos do exe. o código irá explicá-lo. isso faz parte da minha classe Sprite e ele usa um DirectX. mas você pode usar qualquer API que você quer ou apenas acessar os dados brutos. não importa.

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

Qualquer dúvida sinta-se livre para perguntar.

Me disseram bbfreeze irá criar um único arquivo .exe, e é mais recente que py2exe.

try c_x congelamento ele pode criar um bom autônomo

Eu py2exe recentemente utilizado para criar um executável para o pós-revisão para enviar comentários para ReviewBoard.

Esta foi a I setup.py usado

from distutils.core import setup
import py2exe

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

É criado um diretório que contém o arquivo exe e as bibliotecas necessárias. Eu não acho que é possível usar py2exe para obter apenas um único arquivo .exe. Se você precisa que você precisa primeiro py2exe uso e, em seguida, usar alguma forma de instalador para fazer o executável final.

Uma coisa a tomar cuidado é que todos os arquivos de ovos que você usa em sua necessidade de aplicação a ser descompactado, caso contrário py2exe não pode incluí-los. Isso é abordado na documentação py2exe.

Não, é não dar-lhe um único executável no sentido de que você só tem um arquivo depois -., Mas você tem um diretório que contém tudo que você precisa para executar o seu programa, incluindo um arquivo exe

Eu só escreveu este setup.py hoje. Você só precisa python setup.py py2exe invoke.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top