2012-02-17 26 views
7

Chúng ta là một cửa hàng trăn. Chúng tôi có các gói python khác nhau được phát triển trong nhà và sẽ được triển khai trên môi trường của khách hàng (máy).Các phương pháp hay nhất để tạo Phân phối Python (trứng) trên (và cho) Nhiều Hệ điều hành

Đây là cách phát triển và chu kỳ phát hành của chúng tôi diễn ra.

Sau khi nhà phát triển hoàn tất "thử nghiệm" gói, bản phân phối (tệp trứng) của gói được chuẩn bị và được đẩy đến một địa điểm lưu trữ trung tâm. Khi chúng tôi muốn triển khai phần mềm của chúng tôi cho Khách hàng, các bản phân phối giống nhau (tệp trứng) sẽ được tải xuống và cài đặt trong môi trường của họ.

Giả sử "thử nghiệm" xảy ra trên nhiều hệ điều hành (để kiểm tra tính tương thích của API trên nền tảng), cách tốt nhất để chuẩn bị phân phối và được đẩy tới vị trí lưu trữ trung tâm.

Tốt nhất là bạn nên có trứng hệ điều hành cụ thể trên máy chủ lưu trữ (ví dụ: samplepkg-1.0.0.win32.egg và samplepkg-1.0.0.linux.egg? Không chắc chắn cách chúng có thể được chuẩn bị theo cách này bằng cách sử dụng setuptools.) Hoặc có một quả trứng duy nhất vì API vẫn giữ nguyên trên các nền tảng? Bất kỳ thực hành nào khác được cộng đồng theo sau?

Trả lời

5

Bạn có thể sử dụng một gói duy nhất nếu:

  1. Các gói phần mềm không sử dụng chức năng/lớp học không có sẵn trên tất cả các nền tảng mục tiêu của bạn (xem ví dụ chương 36-39 của Python tham khảo thư viện tiêu chuẩn cho phiên bản 2.7.2 cho những thứ bạn không nên sử dụng trong trường hợp đó)
  2. Bạn không sử dụng các tiện ích mở rộng được viết bằng C/C++ cần được biên dịch cho mọi nền tảng.

Nó thường là một ý tưởng tốt để tránh xa các chức năng cụ thể của hệ điều hành không có sẵn trên tất cả các nền tảng mục tiêu của bạn. Thư viện chuẩn được viết khá tốt trong khía cạnh đó.

2

Tôi nghĩ rằng trong trường hợp này, việc sử dụng một gói đơn sẽ phức tạp hơn vì những lý do mà Roland đã đề cập ở trên. Trong môi trường phát triển của bạn, bạn có thể có các thư mục riêng biệt cho các nền tảng riêng biệt, mỗi thư mục có mã nền tảng cụ thể (chẳng hạn như các phần mở rộng/thư viện được viết bằng C/C++). Bạn sẽ cần bắt chước các thiết lập của bạn trong các thư mục này để tạo ra những quả trứng riêng biệt, nhưng cuối cùng nó sẽ phức tạp hơn (tôi nghĩ, mà không biết nhiều hơn về mã bạn đang làm việc) so với cố gắng đưa mọi thứ vào một gói.

Trong cả hai trường hợp, đọc tài liệu trên thư viện chuẩn, cũng như các đường rãnh (http://docs.python.org/distutils/) sẽ giúp bạn tìm ra giải pháp của mình.

1

Trứng dành riêng cho nền tảng chỉ nhằm mục đích phân phối các gói chứa mã C; nếu không, bản thân các tập tin trứng là độc lập với nền tảng và bạn chỉ cần phân phối một quả trứng độc lập. Nếu bạn đang sử dụng các công cụ cài đặt tự động hoặc API thời gian chạy của pkg_resources để tìm thư viện và plugin, bạn thực sự có thể đổ tất cả trứng vào một thư mục duy nhất và công cụ cài đặt hoặc API thời gian chạy sẽ chọn trứng để cài đặt hoặc nhập từ.

tl; dr phiên bản: cách setuptools xây dựng trứng là cách chúng được phân phối; nếu bạn cố gắng làm một quả trứng đa nền tảng thành một quả trứng phụ thuộc vào nền tảng hoặc ngược lại, bạn có thể sẽ bị đau.;-)

0

Nếu bạn chỉ có mô-đun python, hãy giữ tất cả sự khác biệt bị ẩn trong python, hoặc cùng một tệp (python std lib) hoặc các tệp riêng biệt (pyserial).

Nếu bạn đã biên dịch mô-đun, điều này sẽ phức tạp hơn một chút.

tôi sử dụng cấu trúc thư mục sau đây cho một dự án mà cần biên soạn phần mở rộng:

./lib/display.py # frontend, platform-independent 
./lib.linux-x86_64-2.6/_display.so 
./lib.linux-armv5tejl-2.6/_display.so 

Và mã này vào đầu của sự khởi đầu của chương trình:

sys.path.append("lib.%s-%s-%s.%s" % ((posix.uname()[0].lower(), 
             posix.uname()[4]) 
            +sys.version_info[:2])) 

Bạn có thể bọc cấu trúc như điều này trong một .egg quá, miễn là bạn xác định rằng nó không phải là zip-an toàn.