Hướng dẫn are all python packages open source? - có phải tất cả các gói python đều là mã nguồn mở?

Hãy tưởng tượng rằng bạn đã cài đặt một gói Python ngẫu nhiên từ PYPI. Có một cơ hội tốt 13,5% rằng gói không có thông tin cấp phép. Xem xét nó không phải là hiếm khi có hàng trăm phụ thuộc và phụ thuộc phụ trong một ứng dụng Python điển hình, có một cơ hội rất tốt để sử dụng mã không có giấy phép. Tùy thuộc vào bối cảnh, hậu quả của việc sử dụng phần mềm không có giấy phép có thể là bất cứ nơi nào từ không đáng kể đến thảm họa. OK, đó là một phạm vi hoang dã, vì vậy bài đăng này sẽ đào sâu hơn vào vấn đề này.

Pypi là gì?

PYPI là kho lưu trữ trung tâm được sử dụng phổ biến nhất cho các gói Python, được tạo và duy trì bởi Quỹ phần mềm Python. Nó thường được truy cập thông qua các công cụ quản lý gói, chẳng hạn như PIP, để tải xuống và cài đặt các thư viện và ứng dụng Python. Điều này tương tự như các kho lưu trữ gói cho các ngôn ngữ khác, chẳng hạn như NPM cho JavaScript, Rubygems.org cho Ruby và Crates.io cho Rust.

Tiểu sử

SNYK phân tích sự phụ thuộc của các dự án phần mềm và tìm thấy các vấn đề như lỗ hổng bảo mật và giấy phép xấu. Cuối cùng, gần đây họ đã thuê tôi để lấy tất cả các dữ liệu meta từ PYPI về các gói và các phiên bản được phát hành của họ, bao gồm thông tin cấp phép. Với dữ liệu này trong tay, tôi đã kiểm tra tình hình cấp phép cho tất cả các gói Python trên PYPI.

Dưới đây là một số hiểu biết chính từ phân tích này, tiếp theo là các đề xuất dựa trên những hiểu biết này và mô tả về các phương pháp được sử dụng để có được chúng.

Làm thế nào là cấp phép trong hệ sinh thái Python?

Đầu tiên, ở đây, một lời từ chối nhanh chóng: Tôi không phải là luật sư. Tôi là một kỹ sư phần mềm có kinh nghiệm với một số hiểu biết về cấp phép phần mềm, nhưng tôi không phải là chuyên gia trong lĩnh vực này. Không có điều nào sau đây được coi là tư vấn pháp lý, vì vậy bạn nên tham khảo ý kiến ​​luật sư nếu bạn cần!

Các loại giấy phép

Nói chung, hầu hết tất cả các giấy phép phần mềm nguồn mở đều có thể được chia thành một vài loại rộng:

  • Giấy phép của Copyleft là một loại giấy phép tương đối hạn chế, bao gồm giấy phép GPL nổi tiếng, nhiều biến thể và giấy phép tương tự. Chúng cho phép phần mềm được sử dụng cho thực tế bất kỳ mục đích nào, nhưng yêu cầu bất kỳ sửa đổi nào bạn thực hiện cũng được công khai. Hơn nữa, một số giấy phép copyleft mạnh mẽ hơn của người Viking yêu cầu mã đó bằng cách sử dụng phần mềm được cấp phép đó cũng được công khai, trong một số trường hợp nhất định.“Copyleft” licenses are a relatively restrictive license type, including the well-known GPL license, its many variations and similar licenses. These allow software to be used for practically any purpose, but require that any modifications you make are also made publicly available. Further, some of the “stronger” copyleft licenses require that code using such licensed software also be made publicly available, in certain circumstances.
  • Mặt khác, các giấy phép cho phép của người Viking, cho phép một người sửa đổi phần mềm mà không phải công khai các sửa đổi đó. Chúng cũng thường đơn giản hơn nhiều và bao gồm ít hạn chế hơn.“Permissive” licenses, on the other hand, allow one to modify the software without having to make those modifications public. They are also generally much simpler and include fewer restrictions.
  • Ở phía xa của quang phổ là các giấy phép của miền công cộng, thường không có giới hạn nào khi sử dụng.“Public Domain” licenses which generally place no restrictions at all on use.

Để thảo luận bổ sung về Copyleft so với cấp phép cho phép, hãy xem một bài viết trước về chủ đề trên blog của chúng tôi.

Trong những năm gần đây, một số giấy phép Copyleft yếu của người Viking đã xuất hiện. Chúng chủ yếu dành cho các thư viện phần mềm, cho phép sử dụng chúng với ít hoặc không có hạn chế nào đối với phần mềm sử dụng. Để biết thêm thông tin về sự khác biệt giữa Copyleft Copyleft, và người mạnh mẽ, hãy xem phần Bài viết của Wikipedia về chủ đề này.

Cũng có thể, mặc dù không được khuyến nghị, để không chỉ định bất kỳ giấy phép nào. Điều này thường là do giám sát hoặc thiếu hiểu biết, nhưng trong một số trường hợp hiếm hoi, nó được thực hiện một cách có chủ ý. Không có giấy phép, việc sử dụng phần mềm chỉ đơn giản là tuân theo luật bản quyền (của mỗi quốc gia!), Và cả các loại luật khác như luật bằng sáng chế.

Phân tích các loại cấp phép

Hãy cùng xem các loại giấy phép được sử dụng trên PYPI:

Hướng dẫn are all python packages open source? - có phải tất cả các gói python đều là mã nguồn mở?

Từ dữ liệu này, chúng ta có thể thấy như sau:

  • Phần lớn các gói trên PYPI, 64%, sử dụng giấy phép cho phép của người dùng, chẳng hạn như giấy phép BSD của MIT, Apache 2.0 và 2 hoặc 3 hoặc 3 điều.64%, use a “permissive” license, such as the MIT, Apache 2.0 and 2- or 3-Clause BSD licenses.
  • 18,5% Sử dụng giấy phép Copyleft mạnh mẽ của người Viking, chẳng hạn như giấy phép GPL và AGPL. use a “strong copyleft” license, such as the GPL and AGPL licenses.
  • 3% Sử dụng giấy phép Copyleft yếu, chẳng hạn như giấy phép LGPL và MPL. use a “weak copyleft” license, such as the LGPL and MPL licenses.
  • Chỉ có 1% sử dụng giấy phép phạm vi công cộng của người Viking, chẳng hạn như CC0, WTFPL và Giấy phép Unlicense.1% use a “public domain” license, such as the CC0, WTFPL and Unlicense licenses.
  • 13,5% don lồng bao gồm bất kỳ giấy phép.

Điều này không có gì đáng ngạc nhiên, vì nó tương tự như các xu hướng chung được thấy trên Github và các kho lưu trữ gói các ngôn ngữ khác.

Giấy phép phổ biến nhất cho các gói Python

Bốn giấy phép thống trị cảnh quan trên PYPI, cụ thể là MIT, mệnh đề BSD-2, GPL-3.0 và Apache-2.0.

Hướng dẫn are all python packages open source? - có phải tất cả các gói python đều là mã nguồn mở?

Nhiều giấy phép khác cũng được sử dụng phổ biến (được sử dụng bởi ít nhất 100 gói). Trong số này, hai là duy nhất cho hệ sinh thái Python: Giấy phép nền tảng phần mềm Python (PSF) và Giấy phép công cộng Zope (ZPL).

Hướng dẫn are all python packages open source? - có phải tất cả các gói python đều là mã nguồn mở?

Những gì bạn nên làm bây giờ!

Với việc cấp phép các gói Python trên PYPI, tôi đánh giá cao những điều sau đây:

  • Kiểm tra xem bạn trực tiếp hoặc gián tiếp sử dụng phần mềm sử dụng giấy phép của Copyleft và thoải mái với ý nghĩa của nó đối với mã của bạn.
    1. Nếu bạn viết mã độc quyền (nguồn không mở), thì đây có thể là một trách nhiệm pháp lý nghiêm trọng, đặc biệt là với các giấy phép copyleft mạnh mẽ được sử dụng bởi hơn 18% gói PYPI.
    2. Nếu bạn viết phần mềm nguồn mở, những điều này có thể có nghĩa là bạn sẽ bị buộc phải cấp phép mã của mình theo các điều khoản cấp phép tương tự.
  • Kiểm tra xem có bất kỳ sự phụ thuộc nào của bạn đang thiếu giấy phép.
    1. Nếu bạn cần sửa đổi sự phụ thuộc như vậy, hoặc có thể cần trong tương lai, bạn có thể không được phép theo luật bản quyền.
    2. Các phiên bản trong tương lai của các phụ thuộc như vậy có thể sẽ giới thiệu giấy phép và bạn không thể chắc chắn loại giấy phép sẽ là gì.
  • Thiết lập một công cụ tự động để định kỳ / liên tục kiểm tra việc cấp phép cho các phụ thuộc của bạn.
    1. Trong một dự án, các phụ thuộc trọn đời thường được thêm và thay đổi.
    2. Sự phụ thuộc có thể thay đổi giấy phép giữa các phiên bản, vì vậy nâng cấp phiên bản có thể dẫn đến thay đổi cấp phép.

Đọc thêm

Chúng tôi chỉ cần trầy xước bề mặt; Cấp phép có thể quan trọng với bạn hơn bạn nhận ra và bạn nên đọc thêm! Cân nhắc đọc các chủ đề sau:

  • Nhiều cấp phép (~ 500 gói trên PYPI được nhiều cấp phép)
  • Khả năng tương thích giấy phép
  • Phần mềm không có giấy phép
  • Xem xét và giải thích các giấy phép cho phép phổ biến
  • Mặt pháp lý của nguồn mở, và đặc biệt là phần về việc chọn giấy phép cho phần mềm của bạn.

Phương pháp

Dưới đây là một số chi tiết về cách thu thập và phân tích dữ liệu được tiến hành.

Đầu tiên, tôi đã thu thập siêu dữ liệu của tất cả các gói và tất cả các phiên bản được phát hành của chúng trên PYPI. Điều này đã được thực hiện trong nhiều ngày vào đầu tháng 8 năm 2018. Vào thời điểm đó, có gần 150.000 gói trên PYPI.

Sau đó, tôi đã trích xuất thông tin giấy phép cho từng phiên bản của mỗi gói, từ cả hai trường cấp phép và các trường phân loại trên mạng. Sau đó, tôi đã tổng hợp những thứ đó vào một cấu trúc dữ liệu duy nhất, với các phiên bản được sắp xếp theo cách giải thích kiểu phiên bản ngữ nghĩa.

Tiếp theo tôi làm sạch và bình thường hóa dữ liệu cấp phép. Tôi đã xây dựng trên một phiên bản của một tiêu chuẩn giấy phép SPDX được sử dụng tại SNYK. Tôi đã cải thiện một cách chính xác hóa để nhận ra chính xác một phần lớn của giấy phép, theo sau là tạo ra một ánh xạ lớn các trường hợp đặc biệt để xử lý đuôi dài của các trường hợp đặc biệt.

Sau này, tôi bắt đầu phân tích 18% các gói mà không có giấy phép. Tôi chưa xem các tập tin trong bản phát hành. Tôi đã chọn ngẫu nhiên 50 gói không có giấy phép, tải xuống các bản phát hành mới nhất của họ và tìm kiếm thông tin cấp phép. Sau khi thu thập thông tin này, tôi đã phân loại các gói này thành năm loại như sau:

Hướng dẫn are all python packages open source? - có phải tất cả các gói python đều là mã nguồn mở?

Chỉ những người thuộc danh mục được cấp phép của người Viking thực sự có giấy phép. Trong số những người theo các hạng mục đào tạo của người Viking, các loại hình vứt bỏ và người giữ chỗ, phần lớn đã bao gồm một số mã và có thể được sử dụng như một sự phụ thuộc, cho dù có mục đích hay do nhầm lẫn (ví dụ: một lỗi đánh máy). Do đó, tôi thấy hợp lý khi xem xét các gói không có giấy phép thích hợp này. Ngoại suy từ mẫu này, tôi đã đưa ra ước tính rằng ~ 18% × 72% = ~ 13,5% các gói PYPI không được cấp phép.

Điều đáng chú ý là tôi đã thực hiện phân tích tương tự cho các gói được cấp phép trên PYPI; Có khả năng là có rất nhiều gói đào tạo của người Viking, người khác, và các gói giữ chỗ của người khác đã đề cập đến một giấy phép. Do đó, có lập trường bảo thủ mà chỉ ~ 18% × 28% = ~ 5% các gói thực tế trên mạng trên PYPI không được cấp phép có thể không chính xác nghiêm trọng. Tôi không có thời gian để thực hiện một phân tích như vậy, thật không may, vì vậy tôi đã bị mắc kẹt với phân tích được mô tả ở trên. Nếu bạn có bất kỳ câu hỏi hoặc nhận xét nào, tôi rất thích nghe từ bạn! Vui lòng liên hệ với tôi trên Twitter tại @Taleinat.
If you have any questions or comments, I’d love to hear from you! Please reach out to me on twitter at @taleinat.

Nguồn chính thức của các gói Python là gì?

PYPI được điều hành bởi Quỹ phần mềm Python, một tổ chức từ thiện. Một số người quản lý gói, bao gồm PIP, sử dụng PYPI làm nguồn mặc định cho các gói và phụ thuộc của chúng. Tính đến ngày 17 tháng 1 năm 2022, có thể truy cập hơn 350.000 gói Python thông qua PYPI. is run by the Python Software Foundation, a charity. Some package managers, including pip, use PyPI as the default source for packages and their dependencies. As of 17 January 2022, more than 350,000 Python packages can be accessed through PyPI.

Python là nguồn mở hay được cấp phép?

Tất cả các bản phát hành Python là nguồn mở (xem https://opensource.org/ cho định nghĩa nguồn mở).Trong lịch sử, hầu hết, nhưng không phải tất cả, các bản phát hành Python cũng đã tương thích với GPL;Bảng dưới đây tóm tắt các bản phát hành khác nhau.Open Source (see https://opensource.org/ for the Open Source Definition). Historically, most, but not all, Python releases have also been GPL-compatible; the table below summarizes the various releases.

Có bao nhiêu thư viện Python nguồn mở?

Nhiều thư viện nguồn mở đã được tạo ra để làm cho cuộc sống dễ dàng cho các lập trình viên và tiết kiệm một số giờ lập trình chuyên sâu.Tuy nhiên, có 137.000 thư viện Python!Và nó có thể trở nên khá áp đảo cho người mới bắt đầu nghiên cứu, sắp xếp và chọn các thư viện anh ta cần học.

Nguồn mở trong Python là gì?

Phần mềm nguồn mở là mã được thiết kế để có thể truy cập công khai, bất cứ ai cũng có thể thấy, sửa đổi và phân phối mã khi họ thấy phù hợp.code that is designed to be publicly accessible—anyone can see, modify, and distribute the code as they see fit.