py2exe - tạo tập tin thực thi duy nhất


142

Tôi nghĩ rằng tôi nghe nói rằng py2exe có thể làm điều này, nhưng tôi không bao giờ tìm ra nó. có ai làm việc này thành công không? Tôi có thể xem tệp setup.py của bạn không và bạn đã sử dụng tùy chọn dòng lệnh nào?

Về cơ bản, tôi đang nghĩ về việc nó cung cấp cho tôi một tệp thực thi duy nhất thực hiện một cái gì đó giống như tự mở khóa để có thể / tạm thời và chạy.


Điều này có áp dụng cho Python 3 hoặc các phiên bản sau python 2 không?
Vincent

Câu trả lời:


105

PyInstaller sẽ tạo một tệp .exe duy nhất không có phụ thuộc; sử dụng --onefiletùy chọn. Nó thực hiện điều này bằng cách đóng gói tất cả các lib được chia sẻ cần thiết vào tệp thực thi và giải nén chúng trước khi chạy, giống như bạn mô tả (EDIT: py2exe cũng có tính năng này, xem câu trả lời của minty )

Tôi sử dụng phiên bản PyInstaller từ svn, vì phiên bản mới nhất (1.3) có phần lỗi thời. Nó đã hoạt động rất tốt cho một ứng dụng phụ thuộc vào PyQt, PyQwt, numpy, scipy và một vài thứ nữa.


5
Tôi thấy py2exe hoạt động tốt hơn nhiều so với pyInstaller, khi bạn đang sử dụng trứng. câu trả lời của minty là giải pháp.
gbjbaanb

Xin lưu ý rằng kể từ phiên bản 1.4, PyInstaller không hỗ trợ Python 2.6+ trên Windows
Joril

2
Tôi hiện đang sử dụng phiên bản 1.5.1 và nó hoạt động với Python 2.7.2.
oob

1
py2exe có thể tạo một tệp thực thi nếu bạn chỉ định một vài đối số trong chương trình biên dịch. py2exe có một hướng dẫn cho các tệp thực thi trực tuyến.
trevorKirkby

2
Quan điểm khách quan: Tôi không thấy đây là một câu trả lời chấp nhận được vì nó không giải quyết câu hỏi tạo một tệp exe duy nhất với py2exe. (Tuy nhiên, đây là một câu trả lời hữu ích tất nhiên.)
Jonathan Komar

171

Cách để thực hiện việc này bằng py2exe là sử dụng tùy chọn bundle_files trong tệp setup.py của bạn. Đối với một tệp duy nhất, bạn sẽ muốn đặt bundle_filesthành 1, compressedthành True và đặt tùy chọn zipfile thành Không có. Bằng cách đó, nó tạo ra một tệp nén để phân phối dễ dàng.

Dưới đây là một mô tả đầy đủ hơn về tùy chọn bundle_file được trích dẫn trực tiếp từ trang web py2exe *

Sử dụng "bundle_files" và "zipfile"

Một cách dễ dàng hơn (và tốt hơn) để tạo các tệp thực thi một tệp là đặt bundle_files thành 1 hoặc 2 và đặt zipfile thành Không có. Cách tiếp cận này không yêu cầu trích xuất tệp đến một vị trí tạm thời, cung cấp khởi động chương trình nhanh hơn nhiều.

Các giá trị hợp lệ cho bundle_files là:

  • 3 (mặc định) không bó
  • 2 gói mọi thứ trừ trình thông dịch Python
  • 1 gói mọi thứ, bao gồm trình thông dịch Python

Nếu zipfile được đặt thành Không, các tệp sẽ được gói trong tệp thực thi thay vì library.zip.

Dưới đây là một thiết lập mẫu:

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
Chắc chắn nếu bạn chỉ muốn trình thông dịch không được gói thì chọn 2 cho tùy chọn bundle_files. Chúc may mắn!
bạc hà

13
Xin lưu ý rằng bundle_files 1 không được hỗ trợ trên amd64 (ít nhất là py2exe 0.6.9 cho Python 2.6)
Joril

2
@Pat: Cuộc gọi để chạy py2exe là "python setup.py py2exe". Bằng cách tự động thêm "py2exe" vào cuối, điều đó chỉ có nghĩa là bạn không phải nhập nó vào dòng lệnh.
orlade

2
Không chính xác một thực thi duy nhất, như bạn cần phải cài đặt Microsoft Visual C DLL runtime .
Kevin Smyth

2
Tôi đã có một ứng dụng giao diện điều khiển mà tôi muốn có như một tệp thực thi. Tôi đã phải thay thế windows = [{'script': "single.py"}]bằng console = ['single.py']cách nhấp đúp vào tệp sẽ mở trong cửa sổ CMD trong Windows.
Jeff B

13

Như các poster khác đề cập, py2exe, sẽ tạo ra một thư viện thực thi + một số thư viện để tải. Bạn cũng có thể có một số dữ liệu để thêm vào chương trình của bạn.

Bước tiếp theo là sử dụng một trình cài đặt, để gói tất cả những thứ này thành một chương trình có thể cài đặt / không thể cài đặt dễ sử dụng.

Tôi đã sử dụng InnoSetup ( http://www.jrsoftware.org/isinfo.php ) trong vài năm và cho các chương trình thương mại, vì vậy tôi chân thành khuyên bạn nên dùng nó.


+1 để chỉ ra rằng sau py2exe vẫn còn những thứ cần đóng gói.
joaquin

6

Tôi đã có thể tạo một tệp exe duy nhất với tất cả các tài nguyên được nhúng vào exe. Tôi đang xây dựng trên các cửa sổ. do đó sẽ giải thích một số cuộc gọi os.system tôi đang sử dụng.

Đầu tiên tôi đã thử chuyển đổi tất cả hình ảnh của mình thành bitmats và sau đó tất cả các tệp dữ liệu của tôi thành chuỗi văn bản. nhưng điều này gây ra exe cuối cùng là rất rất lớn.

Sau khi google được một tuần, tôi đã tìm ra cách thay đổi tập lệnh py2exe để đáp ứng nhu cầu của mình.

Đây là liên kết vá trên sourceforge tôi đã gửi, xin vui lòng gửi ý kiến ​​để chúng tôi có thể đưa nó vào bản phân phối tiếp theo.

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

Điều này khám phá tất cả các thay đổi được thực hiện, tôi chỉ cần thêm một tùy chọn mới vào dòng thiết lập. đây là setup.py của tôi.

tôi sẽ cố gắng bình luận nó tốt nhất có thể. Vui lòng biết rằng setup.py của tôi rất phức tạp với thực tế là tôi đang truy cập hình ảnh theo tên tệp. vì vậy tôi phải lưu trữ một danh sách để theo dõi chúng.

đây là từ trình bảo vệ màn hình muốn b mà tôi đang cố gắng thực hiện.

Tôi sử dụng exec để tạo thiết lập của tôi trong thời gian chạy, dễ dàng hơn để cắt và dán như vậy.

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

phá vỡ

script = py script tôi muốn chuyển sang exe

icon_resource = biểu tượng cho exe

file_resource = tập tin tôi muốn nhúng vào exe

other_resource = một chuỗi để nhúng vào exe, trong trường hợp này là danh sách tệp.

Tùy chọn = tùy chọn py2exe để tạo mọi thứ vào một tệp exe

bitmap_strings = danh sách các tệp cần bao gồm

Xin lưu ý rằng file_resource không phải là một tùy chọn hợp lệ cho đến khi bạn chỉnh sửa tệp py2exe.py như được mô tả trong liên kết ở trên.

Lần đầu tiên tôi đã cố gắng đăng mã trên trang web này, nếu tôi hiểu sai, đừng làm phiền tôi.

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, đó là cho setup.py bây giờ phép thuật cần thiết để truy cập hình ảnh. Tôi đã phát triển ứng dụng này mà không có py2exe trong tâm trí và sau đó thêm nó sau. vì vậy bạn sẽ thấy quyền truy cập cho cả hai tình huống. nếu không thể tìm thấy thư mục hình ảnh, nó sẽ cố gắng kéo hình ảnh từ tài nguyên exe. mã sẽ giải thích nó. đây là một phần của lớp sprite của tôi và nó sử dụng directx. nhưng bạn có thể sử dụng bất kỳ api nào bạn muốn hoặc chỉ truy cập dữ liệu thô. không quan trọng

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

Bất kỳ câu hỏi rơi miễn phí để hỏi.


Tôi đã thử phương pháp của bạn và nó hoạt động tốt nhưng tôi không biết cách thêm tệp vào tùy chọn file_resurces để nhúng một số tệp vào .exe. Tôi đã sửa đổi tệp build_exe.py như bạn đã nói nhưng khi tôi vào tệp setup.py và tôi viết \'file_resources': [('txt2.txt')]nó sẽ báo lỗi (tệp mà tôi muốn nhúng trong .exe của mình có tên là txt2 và đó là tệp .txt )
VinceLomba

Bạn đã nói về cách bạn chuyển đổi tất cả hình ảnh của mình thành bitmats và sau đó tất cả các tệp dữ liệu của bạn thành chuỗi văn bản. Mặc dù bạn nói rằng nó làm cho exe lớn, nhưng nó có hoạt động không và nếu vậy, bạn có thể cho tôi biết làm thế nào để làm điều này? Tôi biết câu trả lời này khá cũ nhưng nếu bạn có thể trả lời sẽ được đánh giá cao.
Peppa

4

Bạn nên tạo một trình cài đặt, như đã đề cập trước đó. Mặc dù cũng có thể để py2exe bó mọi thứ thành một tệp thực thi duy nhất, bằng cách đặt tùy chọn bundle_files thành 1 và đối số từ khóa zipfile thành Không, tôi không khuyến nghị điều này cho các ứng dụng PyGTK.

Đó là do GTK + cố tải các tệp dữ liệu của nó (cục bộ, chủ đề, v.v.) từ thư mục mà nó được tải từ đó. Vì vậy, bạn phải đảm bảo rằng thư mục của tệp thực thi của bạn cũng chứa các thư viện được sử dụng bởi GTK + và các thư mục lib, share và vv từ cài đặt GTK + của bạn. Nếu không, bạn sẽ gặp sự cố khi chạy ứng dụng của mình trên máy mà GTK + không được cài đặt trên toàn hệ thống.

Để biết thêm chi tiết, hãy đọc hướng dẫn của tôi về py2exe cho các ứng dụng PyGTK . Nó cũng giải thích cách gói mọi thứ, nhưng GTK +.


1

Tôi đã nói với bbfreeze sẽ tạo một tệp .EXE và mới hơn py2exe.


3
Theo như tôi có thể hiểu thì bbfreeze không tạo ra các tệp thực thi đơn. Bạn có thể ghi lại câu trả lời của bạn?
joaquin

-1

Hãy thử đóng băng c_x nó có thể tạo ra một độc lập tốt


cx_Freeze không thể tạo một tệp thực thi độc lập, trên thực tế, tài liệu cho cx_Freeze tại buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/ trộm nói, "cx_Freeze không hỗ trợ xây dựng một tệp exe, trong đó tất cả các thư viện cho ứng dụng của bạn được nhúng vào một tệp thực thi. " Để biết thêm chi tiết về các tệp thực thi độc lập trong cx_Freeze, hãy truy cập tài liệu ( buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/ít ) và đi đến phần 4.5.
Peppa

-2

Gần đây tôi đã sử dụng py2exe để tạo một tệp thực thi để đánh giá sau khi gửi đánh giá tới ReviewBoard.

Đây là setup.py tôi đã sử dụng

from distutils.core import setup
import py2exe

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

Nó tạo ra một thư mục chứa tệp exe và các thư viện cần thiết. Tôi không nghĩ có thể sử dụng py2exe để chỉ lấy một tệp .exe duy nhất. Nếu bạn cần điều đó trước tiên bạn sẽ cần sử dụng py2exe và sau đó sử dụng một số dạng trình cài đặt để thực hiện cuối cùng.

Một điều cần quan tâm là bất kỳ tệp trứng nào bạn sử dụng trong ứng dụng của mình cần được giải nén, nếu không py2exe không thể bao gồm chúng. Điều này được đề cập trong các tài liệu py2exe.


-6

Không, nó không cung cấp cho bạn một tệp thực thi theo nghĩa là bạn chỉ có một tệp sau đó - nhưng bạn có một thư mục chứa mọi thứ bạn cần để chạy chương trình của mình, bao gồm tệp exe.

Tôi vừa mới viết cái thiết lập này hôm nay. Bạn chỉ cần gọi python setup.py py2exe.


1
Điều này không chính xác. Với các tùy chọn chính xác, bạn có thể nhận được một tệp độc lập.
trevorKirkby

@Torsten Marek ... liên kết đến setup.py của bạn đã chết. Đặc biệt .. hai đầu tiên cuối cùng quảng bá các công cụ thương mại. Lần thứ ba nó kết thúc ở đây vào ngõ cụt của internet.
ZF007
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.