2011-08-23 29 views
23

Câu hỏi ngắn
Có cách nào để kiểm soát/đảm bảo kiến ​​trúc (32 bit so với 64bit) khi xây dựng trình cài đặt pyinstaller không?Tôi có thể kiểm soát kiến ​​trúc (32 bit so với 64bit) khi xây dựng một trình cài đặt pyinstaller không?

nền
tôi đã di chuyển từ py2exe để PyInstaller vì thiếu sự hỗ trợ 64bit cùng với một loạt những việc nhỏ mà tôi đang có một thời gian khó tìm quá khứ. Vì vậy, trên ghi chú đó, tôi thích không phải để quay lại. Tôi đã phát triển hai ứng dụng bằng cách sử dụng Python 2.7 64bit và có vấn đề về hiệu suất khi chạy trên chúng máy 32 bit.

Đầu tiên là GUI đơn giản wxPython (phiên bản 2.9) và kết nối với tệp DLL cửa sổ cho trình điều khiển USB. Điều này có vẻ khá "an toàn" để chạy như 32 bit vì không có mô-đun nào chỉ có 64bit. Tuy nhiên, ứng dụng này khi chạy trên Windows XP 32 bit có các vấn đề về hiệu suất khủng khiếp khi nói chuyện với thiết bị USB.

Ứng dụng thứ hai lớn hơn nhiều và tôi chưa cố gắng xây dựng và chạy được vì lo ngại về vấn đề kiến ​​trúc. Ứng dụng này có một số mô-đun chỉ 64 bit (psycopg2 cho một) được sử dụng trong đó. Tôi muốn tránh xa việc cố gắng xây dựng điều này nếu nó không thể chạy dưới dạng tệp thực thi 32 bit.

Suy nghĩ hiện tại
tôi cảm thấy rằng điều này có thể (nếu các module có hỗ trợ 32bit) bằng cách chạy build.py với Python buộc trong chế độ 32bit. Liệu điều này có ý nghĩa gì?

Cập nhật
Tôi đã có một số đột phá về chương trình đầu tiên tôi đang xây dựng. Nó chỉ ra các vấn đề hiệu suất chỉ dựa trên tốc độ của hai máy. Máy dev của tôi có đủ sức mạnh để thăm dò thiết bị USB đủ nhanh và nền tảng thử nghiệm chậm hơn nhiều (Windows XP) thì không.

Tôi đã khắc phục sự cố này bằng cách sửa đổi cách tôi đã thăm dò cổng USB. Bây giờ điều này đã được sửa, tôi có thể chạy exe trên cả hai hệ thống. Một vấn đề mới đã xuất hiện khi cố gắng xây dựng tệp thực thi dưới dạng một tệp duy nhất. Khi chạy Build.py của trình cài đặt python, nó kéo tất cả các tệp DLL cần thiết mà ứng dụng cần chạy. Điều này dường như làm việc tốt lúc đầu, nhưng khi tôi cố gắng chạy exe duy nhất mà tôi xây dựng trên Windows 7 64bit, nó sẽ không chạy trên Windows XP vì DLL dongle USB không được công nhận là một DLL hợp lệ.

Để có được exe duy nhất chạy trên cả hai hệ thống, trước tiên tôi đã cố gắng loại bỏ tệp DLL khỏi tệp .spec (xuất hiện là tập lệnh python). Nó đã được thuận tiện bởi vì tôi đã có thể sửa đổi danh sách bao gồm trước khi lệnh xây dựng với các modifier danh sách python thông thường. Hy vọng của tôi là nếu DLL không được tìm thấy trong thư mục tạm thời của exe, nó sẽ tìm thấy nó trên hệ thống PATH. Trong khi cách tiếp cận này có thể hoạt động, tôi không thể chạy nó mà không có nhiều lỗi.

Nỗ lực thứ hai của tôi là xây dựng ứng dụng trên máy tính Windows XP (để DLL nhúng) với hy vọng rằng Win XP DLL sẽ hoạt động trong Windows 7. Thành công! Cấu hình này hoạt động tốt; Tuy nhiên tôi tin tưởng mạnh mẽ rằng đây không phải là giải pháp tốt nhất vì nó chỉ phụ thuộc vào DLL cũ chạy trên một hệ điều hành mới hơn.

+2

Tôi biết rằng bạn có một giải pháp làm việc, nhưng bạn đã thử cài đặt Python 32 bit trên máy Win7 và sử dụng nó để chạy build.py? Bạn sẽ phải cài đặt tất cả các phụ thuộc 32-bit là tốt, nhưng đó nên lấy đúng 32-bit DLLs. (Mặt khác, nó có thể không hoạt động nếu bạn cần hỗ trợ XP.) – Velociraptors

+0

@Velociraptors: DLL duy nhất mà nó dường như lấy mà tôi không muốn nó là DLL cho USB dongle. Phần mềm của thiết bị này chỉ là 32bit, vì vậy tôi đang đi ra ngoài một chi và đoán rằng người lái xe cũng là 32bit. Vì vậy, trong trường hợp này tôi nghĩ rằng đó là một vấn đề không tương thích trình điều khiển 7 vs XP. –

Trả lời

7

Nếu bạn đang xây dựng một ứng dụng và nó chạy tốt trên Windows 32 bit, không cần phải tạo phiên bản 64 bit. Chỉ cần tạo một phiên bản 32-bit và chạy nó trên cả hai kiến ​​trúc. WOW64 là cái gì.

Nếu bạn cần sử dụng thư viện hoặc tính năng chỉ có 64 bit, chỉ cần tạo phiên bản 64 bit. Không có điểm nào trong việc xây dựng phiên bản 32 bit nếu tính năng này chỉ có 64 bit.

Lý do duy nhất để tạo phiên bản 64 bit và 32 bit, là tận dụng tối đa không gian địa chỉ của cửa sổ 64 bit. I E. nếu bạn định phân bổ nhiều hơn 1 hoặc 2 GB bộ nhớ. Một ví dụ có thể là một ứng dụng chỉnh sửa hình ảnh hoặc một ứng dụng thao tác dữ liệu. Sau đó, bạn có thể chạy trên nền tảng 32 bit trong các ràng buộc của nền tảng nhưng chỉnh sửa hình ảnh lớn hơn hoặc số lượng dữ liệu lớn hơn trên nền tảng 64 bit.

IOW, đối với trường hợp của bạn, hãy làm theo gợi ý của @Velociraptors và xây dựng trong python 32 bit nếu bạn đang xây dựng một exe 32 bit.

+2

Xin lỗi vì sự chậm trễ này trong một phản hồi. Tôi đồng ý với bạn trong thực tế là nếu 64 bit không cần thiết, không sử dụng nó. Tuy nhiên nếu tôi đang chạy Windows 7 64 bit và 64 bit Python, làm thế nào tôi có thể tạo một phiên bản 32-bit? Đó là câu hỏi thực sự ở đây. –

+0

@AdamLewis, Cài đặt 32-bit python là tốt, và có xây dựng kịch bản của bạn tạo ra cả hai thực thi. – Ben

10

Pyinstaller tạo ra một nhị phân tùy thuộc vào python bạn sử dụng để xây dựng nó. Vì vậy, nếu bạn sử dụng python 2,7 64 bit thì không thể, theo như tôi biết, để tạo ra một tệp thực thi 32 bit. Điều này là do Pyinstaller lưu trữ tất cả các mô-đun và phụ thuộc của chúng (dlls, pyds vv ..) là 64 bit do cài đặt python.

Như đã nói, tốt hơn, vì các vấn đề tương thích chéo, để xây dựng các tệp nhị phân 32 bit. Có lẽ bạn có thể chỉ định thêm câu hỏi của mình.

Các vấn đề liên quan