2014-06-10 18 views
7

Tôi hiện đang viết một ứng dụng dòng lệnh bằng Python, cần được cung cấp cho người dùng cuối theo cách dễ dàng tải xuống và chạy. Đối với những người trên Windows, những người có thể không có Python (2.7) được cài đặt, tôi có ý định sử dụng PyInstaller để tạo ra một Windows thực thi khép kín. Sau đó, người dùng có thể tải xuống "myapp.exe" và chạy myapp.exe [ARGUMENTS].Đóng gói một ứng dụng dòng lệnh để phân phối?

Tôi cũng muốn cung cấp bản tải xuống (nhỏ hơn) cho người dùng (trên các nền tảng khác nhau) đã cài đặt Python. Một tùy chọn là đặt tất cả mã của tôi vào một tệp .py duy nhất, "myapp.py" (bắt đầu bằng #! /usr/bin/env python) và cung cấp mã này. Điều này có thể được tải xuống, sau đó chạy bằng cách sử dụng myapp.py [ARGUMENTS] hoặc python myapp.py [ARGUMENTS]. Tuy nhiên, việc hạn chế ứng dụng của tôi thành một tệp .py có một số nhược điểm, bao gồm hạn chế khả năng tổ chức mã của tôi và làm cho việc sử dụng phụ thuộc của bên thứ ba trở nên khó khăn.

Thay vào đó, tôi muốn phân phối nội dung của một số tệp của mã của riêng tôi, cộng với một số phụ thuộc (tinh khiết Python). Có bất kỳ công cụ nào có thể gói tất cả điều này vào một tệp duy nhất, có thể dễ dàng tải xuống và chạy bằng cài đặt Python hiện có không?

Chỉnh sửa: Lưu ý rằng tôi cần những ứng dụng này để dễ dàng cho người dùng cuối kết thúc để chạy. Họ không có khả năng cài đặt pip hoặc bất kỳ thứ gì khác ngoài lõi Python. Sử dụng PyInstaller, tôi có thể tạo một tệp mà những người dùng này có thể tải xuống từ web và chạy bằng một lệnh (hoặc, nếu không có đối số, chỉ cần bằng cách nhấp đúp). Có cách nào để đạt được điều này dễ sử dụng mà không cần sử dụng PyInstaller (tức là không có gói redundantly Python runtime)?

+3

cho giải pháp thứ hai (nhỏ), tại sao không sử dụng pip? –

+0

Bạn có các câu hỏi rất giống [ở đây về Windows] (http://stackoverflow.com/questions/2136837/process-to-convert-simple-python-script-into-windows-executable?rq=1) và [tại đây trong chung] (http://stackoverflow.com/questions/7156333/packaging-a-python-application?rq=1) – logc

+0

Bạn đề cập đến các nền tảng khác nhau, nhưng không đề cập đến chúng là gì. "Gói cài đặt sudo apt-get" có đủ dễ dàng cho người dùng cuối của bạn không? – berto

Trả lời

5

Bạn có thể sử dụng pip như được đề xuất trong các nhận xét. Bạn cần tạo một dự án MANIFEST.insetup.py trong dự án của mình để có thể cài đặt. Bạn cũng có thể thêm mô-đun làm điều kiện tiên quyết. Thông tin thêm có thể được tìm thấy trong câu hỏi này (không cụ thể cho Django):

How do I package a python application to make it pip-installable?

này sẽ làm cho mô-đun của bạn có sẵn trong Python. Sau đó, bạn có thể yêu cầu người dùng chạy tệp chạy mô-đun của mình, bằng cách python path/run.py, ./path/run.py (với sự cho phép +x) hoặc python -c "some code here" (ví dụ: cho bí danh).

Bạn thậm chí có thể có người sử dụng cài đặt từ một reporitory công git, như thế này

pip install git+https://bitbucket.org/yourname/projectname.git 

... trong trường hợp này họ cũng cần git.

+1

Bạn cũng có thể cài đặt một tarball của ứng dụng bằng pip; điều này loại bỏ yêu cầu git. Ví dụ: 'pip install https: // yourdomain.com/application.tar.gz' – berto

7

Tôi không thích ý tưởng tệp đơn lẻ vì nó trở thành gánh nặng bảo trì. Tôi sẽ khám phá một cách tiếp cận như dưới đây.

Tôi đã trở thành một fan hâm mộ lớn của môi trường ảo của Python bởi vì nó cho phép bạn silo phụ thuộc ứng dụng của bạn từ cài đặt của hệ điều hành. Hãy tưởng tượng một kịch bản mà ứng dụng bạn đang tìm kiếm để phân phối sử dụng gói Python requests v1.0. Một thời gian sau, bạn tạo một ứng dụng khác mà bạn muốn phân phối sử dụng requests v2.3. Bạn có thể kết thúc với phiên bản xung đột trên một hệ thống mà bạn muốn cài đặt cả hai ứng dụng song song. Môi trường ảo giải quyết vấn đề này vì mỗi ứng dụng sẽ có vị trí gói riêng của nó.

Tạo môi trường ảo thật dễ dàng. Khi bạn đã cài đặt virtualenv, chỉ đơn giản là vấn đề chạy, ví dụ: virtualenv /opt/application/env.Bây giờ bạn có một môi trường python bị cô lập cho ứng dụng của bạn. Ngoài ra, môi trường ảo rất dễ làm sạch, chỉ cần xóa thư mục env và bạn đã hoàn tất.

Bạn sẽ cần tệp setup.py để cài đặt ứng dụng của mình vào môi trường. Giả sử ứng dụng của bạn sử dụng requests v2.3.0, mã tùy chỉnh của bạn nằm trong gói có tên là acme và tập lệnh của bạn được gọi là phone_home. cấu trúc thư mục của bạn trông như thế này:

acme/ 
    __init__.py 
    models.py 
    actions.py 
scripts/ 
    phone_home 
setup.py 

Các setup.py sẽ giống như thế này:

from distutils.core import setup 


install_requires = [ 
    'requests==2.3.0', 
] 

setup(name='phone_home', 
     version='0.0.1', 
     description='Sample application to phone home', 
     author='John Doe', 
     author_email='[email protected]', 
     packages=['acme'], 
     scripts=['scripts/phone_home'], 
     url='http://acme.com/phone_home', 
     install_requires=install_requires, 
) 

Bây giờ bạn có thể làm cho một tarball ra khỏi dự án của bạn và lưu trữ nó tuy nhiên bạn muốn (máy chủ web của riêng bạn , S3, vv):

tar cvzf phone_home-0.0.1.tar.gz . 

Cuối cùng, bạn có thể sử dụng pip để cài đặt gói của bạn vào môi trường ảo mà bạn đã tạo:

/opt/application/env/bin/pip install http://acme.com/phone_home-0.0.1.tar.gz 

Sau đó bạn có thể chạy phone_home với:

/opt/application/env/bin/phone_home 

Hoặc tạo một liên kết tượng trưng trong/usr/local/bin để chỉ cần gọi kịch bản sử dụng phone_home:

ln -s /opt/application/env/bin/phone_home /usr/local/bin/phone_home 

Tất cả các các bước trên có thể được đặt trong một kịch bản lệnh shell, điều này sẽ làm cho quá trình cài đặt một lệnh.

Và với sửa đổi nhỏ, phương pháp này hoạt động thực sự tốt cho môi trường phát triển; tức là sử dụng pip để cài đặt/tham chiếu thư mục phát triển của bạn: pip install -e . trong đó . đề cập đến thư mục hiện tại và bạn phải ở trong thư mục dự án của mình cùng với setup.py.

Hy vọng điều này sẽ hữu ích!

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