Cách mạnh mẽ để đảm bảo người khác có thể chạy chương trình python của tôi


17

Tôi muốn đặt một chương trình python trên GitHub và để người khác tải xuống và chạy nó trên máy tính của họ với các hệ điều hành. Tôi còn khá mới với python nhưng đã sử dụng nó đủ để nhận thấy rằng việc đưa các phiên bản các loại của tất cả các mô-đun đi kèm để hoạt động cùng nhau có thể có vấn đề. Tôi mới phát hiện ra việc sử dụng requirements.txt(được tạo pipreqsvà triển khai bằng lệnh pip install -r /path/to/requirements.txt) nhưng rất ngạc nhiên khi nhận thấy rằng requirements.txtthực tế không nêu rõ phiên bản nào của python đang được sử dụng nên rõ ràng nó không phải là giải pháp hoàn chỉnh. Vì vậy, câu hỏi của tôi là: cần có bộ thông số kỹ thuật / tệp / thứ gì khác để đảm bảo rằng ai đó tải xuống dự án của tôi sẽ thực sự có thể chạy nó với ít vấn đề nhất có thể.

EDIT: Kế hoạch của tôi là được hướng dẫn bởi bất kỳ câu trả lời nào nhận được nhiều sự ủng hộ nhất. Nhưng cho đến nay, sau 4 câu trả lời và 127 lượt xem, không một câu trả lời nào có một upvote. Nếu một số câu trả lời là không tốt, sẽ hữu ích khi xem một số ý kiến ​​về lý do tại sao chúng không tốt.


1
trong vài vấn đề có thể xảy ra, bạn đã xem xét Docker (hoặc các giải pháp dựa trên container khác) chưa? docker.com
Zaccharie Ramzi

Re: Docker ... Chỉ cần tìm thấy điều này: "nhà phát triển có thể yên tâm rằng ứng dụng sẽ chạy trên bất kỳ máy Linux nào khác" - nhưng tôi muốn nó hoạt động trên mọi HĐH. ( opensource.com/resource/what-docker )
Mick

Thông thường, bạn có hỗ trợ cho tất cả các hệ điều hành cổ điển: windows ( docs.docker.com/docker-for-windows ) và mac ( docs.docker.com/docker-for-windows )
Zaccharie Ramzi

2
Câu trả lời ở đây là rất bối cảnh. Là chương trình Python đang làm những việc có syshoặc oshoặc các hàm loại quy trình con hoặc nhiều toán học / phân tích hơn? Cái trước có thể thay đổi với từng phiên bản Python và sau này có thể hoàn toàn độc lập với phiên bản. Thư viện phụ thuộc gì? numpy và gấu trúc làm một công việc tuyệt vời trên các nền tảng để bạn có thể kiểm tra xem bạn có phiên bản tối thiểu không. Phiên bản chính nào của Python? Sự khác biệt giữa Python 2.x và 3.x với các thư viện phụ thuộc vẫn trở nên khó khăn hơn. Nếu bạn viết mã tốt nhắm mục tiêu một bản phát hành chính phổ biến đó là một khởi đầu tuyệt vời.
dawg

2
Bằng chứng là vô số câu trả lời, có rất nhiều cách để đi về vấn đề này. Tôi thực sự tò mò nếu câu trả lời sẽ thay đổi dựa trên hiểu biết những gì các ứng dụng. Tôi muốn tin rằng nó không quan trọng, nhưng tôi nghi ngờ nó có thể. Tôi cũng nghĩ rằng nó phụ thuộc rất nhiều vào đối tượng dự định. Tiến sĩ vật lý Savvy chạy một ứng dụng học máy vs Joe internet chơi một pygame của cờ đam.
Marcel Wilson

Câu trả lời:


15

Bạn đã xem xét việc thiết lập một setup.pytập tin? Đây là một cách tiện dụng để kết hợp tất cả ... thiết lập tốt của bạn vào một vị trí. Vì vậy, tất cả người dùng của bạn phải làm là A) sao chép repo của bạn và B) chạy pip install .để chạysetup.py

Có một cuộc thảo luận ngăn xếp tuyệt vời về điều này.

Cũng như một ví dụ xử lý được viết bởi anh chàng yêu cầu.

Điều này sẽ bao gồm hầu hết các trường hợp sử dụng. Bây giờ nếu bạn muốn làm cho nó thực sự phân phối thì bạn sẽ muốn xem xét việc thiết lập nó trong PyPi , trung tâm phân phối chính thức.

Ngoài ra, nếu bạn hỏi làm thế nào để làm cho chương trình "HĐH độc lập" thì không có một kích thước nào phù hợp với tất cả. Nó phụ thuộc vào những gì bạn đang làm với mã của bạn. Yêu cầu nghiên cứu cách mã cụ thể của bạn tương tác với các hệ điều hành đó, v.v.


7

Có rất nhiều, rất nhiều, rất nhiều, rất nhiều, rất nhiều, rất nhiều cách để làm điều này. Tôi sẽ trượt trên các nguyên tắc đằng sau mỗi, và đó là trường hợp sử dụng.

1. Một môi trường trăn

Có rất nhiều cách để làm điều này. pipenv, conda, requirments.txtv.v.

Với một số trong số này, bạn có thể chỉ định các phiên bản python. Với những người khác, chỉ cần chỉ định một loạt các phiên bản python mà bạn biết nó hoạt động với - ví dụ: nếu bạn đang sử dụng python 3.7, không có khả năng không hỗ trợ 3.6; chỉ có một hoặc hai thay đổi nhỏ. 3,8 nên làm việc như là tốt.

Một phương pháp tương tự khác là setup.py. Chúng thường được sử dụng để phân phối các thư viện - như PyInstaller (một giải pháp khác tôi sẽ đề cập dưới đây), hoặc numpy, hoặc wxPython hoặc PyQt5, v.v. - để sử dụng nhập / nhập dòng lệnh. Hướng dẫn đóng gói python khá hữu ích, và có rất nhiều hướng dẫn ngoài kia. (google python setup.py tutorial) Bạn cũng có thể chỉ định các yêu cầu trong các tệp này.

2. Một container

Docker là một trong những lớn. Nếu bạn chưa nghe về nó, tôi sẽ ngạc nhiên. Google tóm tắt nhanh về một bản tóm tắt đi kèm với điều này , mà tôi sẽ trích dẫn một phần của:

Vậy tại sao mọi người đều thích container và Docker? James bottomley, trước đây là CTO của Parallels về ảo hóa máy chủ và là nhà phát triển nhân Linux hàng đầu, đã giải thích các trình ảo hóa VM, như Hyper-V, KVM và Xen, tất cả đều "dựa trên phần cứng giả lập. Điều đó có nghĩa là chúng mập về mặt yêu cầu hệ thống."

Container, tuy nhiên, sử dụng hệ điều hành chia sẻ. Điều này có nghĩa là chúng hiệu quả hơn nhiều so với các trình ảo hóa về thuật ngữ tài nguyên hệ thống. Thay vì ảo hóa phần cứng, các thùng chứa nằm trên một phiên bản Linux duy nhất. Điều này có nghĩa là bạn có thể "bỏ lại đằng sau những thứ rác 99,9% VM vô dụng, để lại cho bạn một viên nang nhỏ gọn gàng chứa ứng dụng của bạn".

Điều đó sẽ tóm tắt nó cho bạn. (Lưu ý bạn không cần một hệ điều hành cụ thể cho các container.)

3. Một tập tin thực thi

Có 2 công cụ chính làm điều này tại thời điểm viết. PyInstaller và cx_Freeze. Cả hai đều tích cực phát triển. Cả hai đều là nguồn mở.

Bạn lấy tập lệnh của mình và công cụ biên dịch nó thành mã byte, tìm các mục nhập, sao chép chúng và tạo một môi trường python di động chạy tập lệnh của bạn trên hệ thống đích mà không cần người dùng cuối cần python.

Cá nhân, tôi thích PyInstaller - Tôi là một trong những nhà phát triển. PyInstaller cung cấp tất cả các chức năng của nó thông qua tập lệnh dòng lệnh và hỗ trợ hầu hết các thư viện mà bạn có thể nghĩ đến - và có thể mở rộng để hỗ trợ thêm. cx_Freeze yêu cầu một tập lệnh thiết lập.

Cả hai công cụ đều hỗ trợ windows, Linux, macOS, v.v. PyInstaller có thể tạo các tệp đơn lẻ hoặc một gói thư mục, trong khi cx_Freeze chỉ hỗ trợ một gói thư mục. PyInstaller 3.6 hỗ trợ python 2.7 và 3.5-3.7 - nhưng 4.0 sẽ không hỗ trợ python 2. cx_Freeze đã bỏ hỗ trợ python 2 kể từ phiên bản chính cuối cùng (6.0 tôi nghĩ).

Dù sao, đủ về các tính năng công cụ; bạn có thể nhìn vào những người đó (Xem https://pyinstaller.orghttps://cx-freeze.readthedocs.io để biết thêm)

Khi sử dụng phương thức phân phối này, bạn thường cung cấp mã nguồn trên repo GitHub, một vài exes (một cho mỗi nền tảng) sẵn sàng để tải xuống và hướng dẫn cách xây dựng mã thành tệp thực thi.


1

Công cụ tốt nhất tôi đã sử dụng cho đến nay là Pipenv . Nó không chỉ thống nhất và đơn giản hóa toàn bộ quy trình công việc pip + virtualenv cho bạn, nhà phát triển, mà còn đảm bảo rằng các phiên bản chính xác của tất cả các phụ thuộc (bao gồm cả Python) được đáp ứng khi người khác chạy dự án của bạn với nó.

Trang web của dự án thực hiện một công việc khá tốt trong việc giải thích cách sử dụng công cụ này, nhưng, để hoàn thiện hơn, tôi sẽ đưa ra một lời giải thích ngắn ở đây.

Khi bạn đã cài đặt Pipenv (ví dụ: bằng cách chạy pip install --user pipenv), bạn có thể truy cập thư mục của dự án và chạy pipenv --python 3.7, vì vậy Pipenv sẽ tạo một virtualenv mới cho dự án của bạn, tạo Pipfile và Pipfile.lock (sẽ nói thêm về chúng sau) . Nếu bạn tiếp tục và chạy pipenv install -r requirements.txtnó sẽ cài đặt tất cả các gói của bạn. Bây giờ bạn có thể thực hiện pipenv shellđể kích hoạt virtualenv mới của bạn hoặc pipenv run your_main_file.pyđơn giản là chạy dự án của bạn.

Bây giờ hãy xem nội dung của Pipfile của bạn. Nó phải là một cái gì đó tương tự như thế này:

[packages]
Django = "*"
djangorestframework = "*"
iso8601 = "*"
graypy = "*"
whitenoise = "*"

[requires]
python_version = "3.7"

Tệp này có các đặc tả có thể đọc được cho con người cho các phụ thuộc của dự án của bạn (lưu ý rằng nó cũng chỉ định phiên bản Python). Nếu các yêu cầu của bạn đã có các phiên bản được ghim, Pipfile của bạn cũng có thể có chúng, nhưng bạn có thể ký tự đại diện một cách an toàn, vì các phiên bản chính xác được lưu trữ trong Pipfile.lock. Bây giờ bạn có thể chạy những thứ như pipenv updateđể cập nhật các phụ thuộc của mình và đừng quên cam kết Pipfile và Pipfile.lock cho VCS của bạn.

Khi mọi người sao chép dự án của bạn, tất cả những gì họ phải làm là chạy pipenv installvà Pipenv sẽ lo phần còn lại (thậm chí có thể cài đặt phiên bản Python chính xác cho họ).

Tôi hy vọng điều này là hữu ích. Tôi không liên kết với bất kỳ cách nào với Pipenv, chỉ muốn chia sẻ công cụ tuyệt vời này.


1

Nếu chương trình của bạn ít về GUI hoặc có GUI web, thì bạn có thể chia sẻ mã bằng Google Colaboratory.

https://colab.research.google.com/

Mọi người đều có thể chạy nó với cùng một môi trường. Không cần cài đặt.


1

Trong trường hợp chuyển đổi tất cả các tập lệnh python của bạn thành một tập tin thực thi có thể giúp bạn, thì câu trả lời của tôi dưới đây sẽ giúp ...

Tôi đã phát triển một ứng dụng máy tính để bàn lớn hoàn toàn bằng python từ 3 năm nay. Nó là một công cụ dựa trên GUI được xây dựng trên đầu thư viện pyqt (liên kết python của khung QT C ++).

Tôi hiện đang sử dụng thư viện đóng gói " py2exe ": là một phần mở rộng distutils cho phép xây dựng các chương trình thực thi Windows độc lập (32 bit và 64 bit) từ các tập lệnh Python; tất cả những gì bạn phải làm là:

  1. cài đặt py2exe: 'pip cài đặt py2exe'

  2. Tạo tập lệnh setup.py: Nó được sử dụng để chỉ định nội dung của EXE cuối cùng (tên, biểu tượng, tác giả, tệp dữ liệu, thư viện dùng chung, v.v.)

  3. Thực thi: python setup.py py2exe

Tôi cũng đang sử dụng phần mềm "Cài đặt Inno" để tạo trình cài đặt: Tạo lối tắt, đặt biến môi trường, biểu tượng, v.v ...


py2exe chưa được cập nhật trong nhiều năm. Tôi không thể tìm thấy bất kỳ hoạt động gần đây. Tôi cho rằng sau đó, nó không rõ ràng. (Ngoài ra, nó chỉ hỗ trợ python <3.4. Điều đó có nghĩa là nó chỉ hỗ trợ các phiên bản python không dùng nữa).
Legorooj


-1

Vì nó bị thiếu trong các câu trả lời khác, tôi muốn thêm một khía cạnh hoàn toàn khác:

Kiểm tra đơn vị. Hoặc thử nghiệm nói chung.

Thông thường, nó là tốt để có một cấu hình tốt được biết đến. Tùy thuộc vào sự phụ thuộc của chương trình là gì, bạn có thể phải kiểm tra các kết hợp gói khác nhau. Bạn có thể làm điều đó một cách tự động với ví dụ toxhoặc là một phần của đường ống CI / CD.

Không có quy tắc chung về sự kết hợp của các gói nên được kiểm tra, nhưng thông thường khả năng tương thích python2 / 3 là một vấn đề lớn. Nếu bạn có sự phụ thuộc mạnh mẽ vào các gói có sự khác biệt lớn về phiên bản, bạn có thể muốn xem xét thử nghiệm đối với các phiên bản khác nhau này.


Đây là một khía cạnh rất quan trọng của phát triển phần mềm. Tuy nhiên, điều này hoàn toàn không trả lời câu hỏi . Làm thế nào để kiểm tra đơn vị giúp phân phối một chương trình?
Legorooj

IMHO, OP không hỏi cụ thể về phân phối. Anh ta hỏi những cách để đảm bảo rằng những người khác có thể chạy chương trình của anh ta. Tôi nghĩ thử nghiệm đơn vị thực sự có thể giúp làm điều đó, vì mọi người có thể bị hạn chế trong tập hợp các gói có thể được sử dụng. Nói chung, câu hỏi phân phối rất quan trọng (và đã được trả lời ở đây), nhưng tôi nghĩ trong kịch bản thế giới thực, chúng ta không thể dựa vào việc tạo toàn bộ venv chỉ cho một gói duy nhất - nó cần tương thích với ít nhất một số cấu hình tiêu chuẩn.
Dschoni

Tôi không tranh luận rằng thử nghiệm đơn vị có giá trị trong việc đảm bảo nó chạy chính xác, nhưng OP đã hỏi cách chia sẻ mã theo cách "dễ cài đặt". Đó là lý do tại sao tôi nghĩ rằng đây là một câu trả lời không hợp lệ - cho câu hỏi cụ thể này.
Legorooj

Tôi vẫn nghĩ rằng câu hỏi không chỉ là về phân phối. Đó là lý do tại sao tôi thêm câu trả lời này. Nếu bạn phát triển trên Windows, ví dụ như thử nghiệm trên Unix là điều cần thiết nếu bạn muốn đảm bảo nó chạy trước khi phân phối.
Dschoni

Vì tò mò, làm thế nào khác với những gì tôi vừa nói? ... making sure it runs correctly ...? Thử nghiệm là một phần thiết yếu của việc bảo đảm nó chạy một cách chính xác, do đó nó là một phần thiết yếu của việc chuẩn bị để phân phối nó, nhưng nó vẫn không liên quan gì đến thực tế phân phối
Legorooj

-1

Tôi sẽ cung cấp cho bạn một bản tóm tắt rất ngắn gọn về một số giải pháp hiện có khi nói đến bao bì trăn mà bạn có thể chọn (kiến thức là sức mạnh):

  1. Thực hiện theo các hướng dẫn được cung cấp tại Structuring Your Project , các quy ước này được cộng đồng python chấp nhận rộng rãi và nó thường là điểm khởi đầu tốt khi những người mới bắt đầu viết mã bằng python. Bằng cách làm theo các hướng dẫn này, pythonists xem dự án / nguồn của bạn tại github hoặc những nơi tương tự khác sẽ biết ngay cách cài đặt nó. Ngoài ra, tải dự án của bạn lên pypi cũng như thêm CI bằng cách tuân theo các quy tắc đó sẽ không gây đau đớn.

  2. Khi dự án của bạn được cấu trúc đúng theo quy ước tiêu chuẩn, bước tiếp theo có thể là sử dụng một số tủ đông có sẵn , trong trường hợp bạn muốn gửi cho người dùng cuối của mình một gói mà họ có thể cài đặt mà không buộc họ phải cài đặt python máy móc. Hãy lưu ý mặc dù các công cụ này sẽ không cung cấp cho bạn bất kỳ mã bảo vệ nào ... nói cách khác, trích xuất mã python ban đầu từ các tạo phẩm cuối cùng sẽ không đáng kể trong mọi trường hợp

  3. Nếu bạn vẫn muốn gửi dự án của mình cho người dùng mà không buộc họ phải cài đặt bất kỳ phụ thuộc dev nào và bạn cũng quan tâm đến việc bảo vệ mã, do đó bạn không muốn xem xét bất kỳ tủ đông nào hiện có mà bạn có thể sử dụng các công cụ như nuitka , shed leather , cython hoặc tương tự. Thông thường việc đảo ngược mã từ các tạo phẩm được tạo ra bởi các công cụ này hoàn toàn không tầm thường ... Mặt khác, bảo vệ bẻ khóa là một vấn đề khác và trừ khi bạn không cung cấp nhị phân vật lý cho người dùng cuối của mình, bạn không thể làm gì nhiều về nó ngoài việc làm chậm chúng :)

  4. Ngoài ra, trong trường hợp bạn cần sử dụng các ngôn ngữ bên ngoài trong dự án python của mình, một liên kết cổ điển khác sẽ xuất hiện là https://wiki.python.org/moin/IntegratingPythonWithOtherLacular , thêm hệ thống xây dựng các công cụ như vậy vào CI bằng cách làm theo quy tắc 1 sẽ khá dễ dàng.

Điều đó nói rằng, tôi khuyên bạn nên bám sát đạn 1 vì tôi biết rằng sẽ đủ tốt hơn để giúp bạn bắt đầu, cũng là điểm đặc biệt đó sẽ bao gồm nhiều trường hợp sử dụng hiện tại cho các dự án "tiêu chuẩn" của python.

Mặc dù đây không phải là một hướng dẫn đầy đủ bằng cách làm theo những người bạn sẽ có thể xuất bản dự án python của bạn tới mọi người ngay lập tức.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.