2012-07-11 22 views
17

Tôi có một tập lệnh đơn giản có phụ thuộc vào dnspython để phân tích cú pháp các tệp vùng. Tôi muốn phân phối tập lệnh này dưới dạng một tệp .py mà người dùng có thể chạy miễn là họ đã cài đặt 2.6/2.7. Tôi không muốn người dùng cài đặt phụ thuộc vào toàn bộ trang web vì có thể có xung đột với các gói/phiên bản hiện tại, cũng như tôi không muốn chúng xung quanh với virtualenv. Tôi đã tự hỏi nếu có một cách để nhúng một gói như dnspython bên trong kịch bản (gzip/base64) và có truy cập kịch bản mà gói lúc chạy. Có lẽ giải nén nó vào một thư mục trong/tmp và thêm vào sys.path? Tôi không quan tâm đến chi phí khởi động, tôi chỉ muốn một đơn .py w/tất cả các phụ thuộc được bao gồm mà tôi có thể phân phối.Có cách nào để nhúng các phụ thuộc trong một tập lệnh python không?

Ngoài ra, sẽ không có phụ thuộc C để xây dựng, chỉ các gói python tinh khiết.

Chỉnh sửa: Tập lệnh không phải là .py. Chỉ cần miễn là nó là một tập tin thực thi duy nhất.

+3

Nếu bạn có thể thư giãn một hạn chế tệp, bạn chỉ có thể gói thư viện dnspython cùng với tệp .py của bạn, dưới dạng tệp zip hoặc chỉ như một tệp độc lập thông thường - giải quyết vấn đề phụ thuộc. Bạn có kiên quyết về việc chỉ có 1 tệp không? –

+4

Con đường để cấp phép địa ngục được lát bằng cách nhúng ... –

+0

@MahmoudAbdelkader Tôi cho rằng điều đó sẽ hoạt động. Python sẽ tìm trong thư mục hiện tại cho gói trước khi tìm kiếm ở nơi khác (mặc dù tôi nghĩ rằng thứ tự này đang thay đổi trong 3). Vẫn muốn có một cách để đóng gói tất cả các phụ thuộc là một tệp thực thi mà người dùng có thể chạy và không có bất kỳ vấn đề nào. Tôi cho rằng nó không phải là một .py. –

Trả lời

8

Bạn có thể đóng gói nhiều tệp Python thành một .egg. Về cơ bản, các tệp trứng chỉ là lưu trữ zip với siêu dữ liệu được xác định rõ - hãy xem tài liệu về setuptools để xem cách thực hiện điều này. Mỗi docs bạn có thể tạo tệp trứng trực tiếp thực thi bằng cách chỉ định điểm vào. Điều này sẽ cung cấp cho bạn một tệp thực thi duy nhất có thể chứa mã của bạn + bất kỳ phụ thuộc nào khác.

EDIT: Hôm nay tôi khuyên bạn nên xây dựng một pex để làm điều này. pex về cơ bản là một tệp zip thực thi với các phụ thuộc không stdlib. Nó không chứa một phân phối python (như py2app/py2exe) nhưng giữ mọi thứ khác và có thể được xây dựng với một lời gọi dòng lệnh duy nhất. https://pex.readthedocs.org/en/latest/

+1

Cảm ơn, tôi đã cố gắng để có được một quả trứng được xây dựng với setuptools ngay bây giờ. Chưa bao giờ xây dựng một quả trứng trước đây vì tôi đã luôn luôn nghe nói rằng họ đã rơi ra khỏi lợi. –

2

vui lòng không làm điều này. Nếu bạn KHÔNG làm một thói quen của nó.

  • pydns được BDS được cấp phép nhưng nếu bạn cố gắng để "nhúng" một module gpl theo cách này bạn có thể gặp rắc rối
  • bạn có thể học cách sử dụng setuptools và bạn sẽ hạnh phúc hơn nhiều trong thời gian dài
  • setuptools sẽ xử lý việc cài đặt các phụ thuộc mà bạn đã xác định (tôi không chắc liệu pydns bạn đang sử dụng có phải là python tinh khiết hay không. Bạn có thể tạo ra các vấn đề cho người dùng của mình nếu bạn tự mình thêm nó mà không biết môi trường của mình)
  • đặt url hoặc pypi để mọi người có thể nâng cấp tập lệnh của bạn với easy_install -U
+0

Gói tôi đang sử dụng là dnspython, không phải pydns.Nếu setuptools có thể xây dựng cho tôi một tập tin thực thi có thể phân phối chỉ yêu cầu python 2.6/2.7, tôi sẽ sử dụng nó. Nếu bạn đang nói chỉ đơn giản là sử dụng nó để cài đặt trang web phụ thuộc rộng thì đây không phải là những gì tôi đã yêu cầu. dnspython là python tinh khiết và tôi không thấy bất cứ điều gì trong đó là giấy phép có thể ngăn tôi nhúng nó. Người dùng cuối không phải là nhà phát triển và không biết gì về hệ sinh thái python (setuptools/easy_install/pip/virtaulenv/etc). –

3

Cách đơn giản nhất là chỉ để đặt tập lệnh python của bạn có tên là __main__.py với phụ thuộc Python tinh khiết trong kho lưu trữ zip, example.

Nếu không, PyInstaller có thể được sử dụng để tạo tệp thực thi độc lập.

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