2011-02-03 27 views
7

Tôi đã bắt đầu sử dụng Pyinstaller trên Py2Exe. Tuy nhiên tôi đã nhanh chóng chạy vào một vấn đề. Làm cách nào để loại trừ các mô-đun mà tôi không muốn và làm cách nào để xem các mô-đun được đưa vào tệp thực thi duy nhất?Python: Loại trừ mô-đun Pyinstaller

Tôi có thể xóa một số tệp pyddll từ thư mục DLL trong quá trình cài đặt Python để Pyinstaller không tìm thấy và do đó không bao gồm chúng. Tôi không thực sự muốn làm điều đó với tất cả các mô-đun vì nó sẽ trở nên khá gian nan.

Tôi đã thử chỉnh sửa tệp spec mà Pyinstaller tạo.

a.binaries - [('ssl','pydoc',)], 

Nhưng kích thước của tệp vẫn giữ nguyên nên tôi kết luận rằng không hoạt động.

Vậy làm thế nào tôi có thể xem những gì các mô-đun Pyinstaller được bao gồm và làm cách nào để loại trừ những mô-đun mà tôi không muốn?

Trả lời

4

Bạn có thể thao tác các danh sách được tạo bởi lớp Phân tích bằng Python. Lưu ý rằng chúng ở định dạng TOC của PyInstaller.

a = Analysis(...) 
... 
# exclude anything from the Windows system dir  
a.binaries = [x for x in a.binaries if not 
       os.path.dirname(x[1]).startswith("C:\\Windows\\system32")] 
19

Chỉ cần tóm tắt các tùy chọn ở đây khi tôi sử dụng chúng.

PyInstaller TOC của - là, như các tài liệu nói:

Một TOC dường như là một danh sách các hàng của mẫu (tên, đường dẫn, typecode). Trong thực tế, đó là một bộ theo thứ tự, không phải là một danh sách. TOC không chứa bản sao, trong đó tính duy nhất chỉ dựa trên tên.

Trong otherwords, chỉ cần:

a_toc = [('uname1','/path/info','BINARY'),('uname2','/path/to','EXTENSION')...] 

Vì vậy, trong tập tin .spec của bạn - một khi bạn đã có những kết quả phân tích của kịch bản - bạn có thể sau đó tiếp tục thay đổi tương ứng TOC bằng một trong hai:

  • Đối với cụ thể tệp/mô-đun sử dụng sự khác biệt (-) và giao lộ (+) để sửa đổi TOC. *

  • Để thêm/xóa danh sách tệp/mô-đun lặp lại trên TOC và so sánh với mã khớp mẫu.

(* Là một sang một bên, cho sự khác biệt để làm việc có vẻ như bạn dứt khoát phải ép TOC() và lưu ý rằng kể từ khi nó chỉ là tên mà duy nhất xác định các yếu tố của bộ này, bạn chỉ cần xác định rằng - do đó ('sqlite3', None, None), v.v.)

Ví dụ minh họa (lấy từ tệp .spec) ở bên dưới - cho tốt hơn hoặc tệ hơn - tôi xóa tất cả các tham chiếu đến scipy, IPython và zmq; xóa cụ thể sqlite, tcl/tk và ssl .DLL's; chèn một opencv còn thiếu .DLL; và cuối cùng xóa tất cả các thư mục dữ liệu được tìm thấy ngoài các thư mục matplotlib ...

Cho dù Pyinstaller .exe có kết quả sau đó sẽ hoạt động khi tệp .pyc cố gắng tải dự kiến ​​hay không.DLL là moot :-/

# Manually remove entire packages... 

a.binaries = [x for x in a.binaries if not x[0].startswith("scipy")] 

a.binaries = [x for x in a.binaries if not x[0].startswith("IPython")] 

a.binaries = [x for x in a.binaries if not x[0].startswith("zmq")] 

# Target remove specific ones... 

a.binaries = a.binaries - TOC([ 
('sqlite3.dll', None, None), 
('tcl85.dll', None, None), 
('tk85.dll', None, None), 
('_sqlite3', None, None), 
('_ssl', None, None), 
('_tkinter', None, None)]) 

# Add a single missing dll... 

a.binaries = a.binaries + [ 
    ('opencv_ffmpeg245_64.dll', 'C:\\Python27\\opencv_ffmpeg245_64.dll', 'BINARY')] 

# Delete everything bar matplotlib data... 

a.datas = [x for x in a.datas if 
os.path.dirname(x[1]).startswith("C:\\Python27\\Lib\\site-packages\\matplotlib")]