2011-01-15 32 views
7

Nếu tôi có gói Python phụ thuộc vào một số thư viện C (ví dụ như Thư viện khoa học Gnu (GSL) để tính toán số), có nên gộp thư viện với mã của tôi không?Tôi có nên gộp các thư viện C bằng ứng dụng Python của mình không?

Tôi muốn làm cho gói của mình dễ cài đặt nhất có thể cho người dùng và tôi không muốn họ phải tải xuống thư viện C bằng tay và cung cấp đường dẫn bao gồm. Ngoài ra tôi luôn có thể đảm bảo rằng phiên bản của thư viện mà tôi gửi tương thích với mã của tôi.

Tuy nhiên, có thể có các xung đột nếu người dùng đã cài đặt thư viện, hoặc có bất kỳ lý do nào khác khiến tôi không nên làm điều này?

Tôi biết rằng tôi có thể giúp người dùng dễ dàng hơn bằng cách chỉ phân phối nhị phân, nhưng tôi muốn tránh phải duy trì bản phân phối nhị phân cho tất cả các hệ điều hành có thể. Vì vậy, tôi muốn dính vào một phân phối nguồn, nhưng đối với người dùng (người tự hào sở hữu một trình biên dịch C) cài đặt nên dễ dàng như python setup.py install.

Trả lời

0

Bạn có thể có hai nhánh riêng biệt của src, một thư mục chứa thư viện và một thư mục khác không có. Bằng cách đó bạn có thể cảnh báo rõ ràng người dùng của bạn trong trường hợp họ đã cài đặt các thư viện. Một giải pháp có thể là (nếu giấy phép của các thư viện cho phép bạn) là để bọc chúng trong một tập tin duy nhất.

Tôi nghĩ rằng không có giải pháp duy nhất, nhưng đây là những ý tưởng tôi có thể nghĩ cho đến nay.

Chúc may mắn

0

Bạn có thể sử dụng virtualenv để tạo ra một môi trường Python tin cho ứng dụng của bạn. Điều này tránh xung đột với các thư viện khác. Tốt nhất là bạn nên đóng gói các mô đun và phụ thuộc như thư viện của mình bằng cách sử dụng Distribute. Distutils là một thứ khác đáng để nghiên cứu.

4

Phân phối là một trong những phần khó cho bất kỳ dự án phần mềm nào. Java và .NET nâng một phần gánh nặng này bằng cách xác định thời gian chạy chuẩn và sau đó chỉ nói "chỉ phân phối mọi thứ khác". Tất nhiên có một nhược điểm: tất cả mọi thứ phải được viết lại bằng ngôn ngữ được hỗ trợ bởi thời gian chạy - ngay khi bạn muốn sử dụng mã gốc, bạn sẽ mất tất cả các ưu điểm.

Khó hơn trong Python, vì nó có trong Ruby, C, C++ và các ngôn ngữ khác, vì chúng thường tận dụng các thư viện gốc hiện có.

Nói chung:

  1. Làm cho nó có thể để có được một sdist nguồn, qua pypi.python.org làm ví dụ. Đặt chính xác các install_requires của bạn (có thể bạn sẽ yêu cầu các ràng buộc python cho GSL, chứ không phải bản thân GSL). Sử dụng bố cục thiết lập chuẩn/bố cục phân phối. Điều này sẽ cho phép bất kỳ ai - giả sử người bảo trì gói cho mọi bản phân phối - để nhận phần mềm của bạn và gói phần mềm đó.

  2. Ngoài ra, hãy cân nhắc cung cấp gói có thể cài đặt đầy đủ cho người xem của bạn. Bạn không cần phải hỗ trợ tất cả các bản phân phối và hệ điều hành; chọn một hoặc hai mà bạn cho là sẽ được sử dụng nhiều nhất. Các công cụ như PyInstaller sẽ cho phép bạn tạo một gói có thể cài đặt, chạy được cho nhiều hệ điều hành, nhưng đặc biệt đối với Linux, bạn có thể muốn người dùng cài đặt phiên bản riêng của phân phối của depitive transs (libgsl?) - bạn sẽ cần một deb đầy đủ hoặc rpm gói để đáp ứng điều đó - một lần nữa, không thử hỗ trợ bất kỳ và tất cả các distro, bạn sẽ bật ra điên. Hỗ trợ một cái gì đó bạn sử dụng nhiều nhất, và cho phép người dùng khác để giúp bạn với các nhu cầu đóng gói khác.

Ngoài ra hãy xem tại Python Packaging Guide

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