Kết bạn với Python và Bash: thư viện smart-env và python-shell

Chúc mọi người một ngày tốt lành.

Ngày nay, Python là một trong những ngôn ngữ được sử dụng nhiều nhất trong lĩnh vực không chỉ tạo ra các sản phẩm phần mềm mà còn cung cấp cơ sở hạ tầng cho chúng. Kết quả là, nhiều tín đồ, dù muốn hay chống lại nó, đều phải học một ngôn ngữ mới để sử dụng sau này như một phần bổ sung cho các tập lệnh Bash cũ tốt. Tuy nhiên, Bash và Python có các cách tiếp cận khác nhau để viết mã và có một số tính năng nhất định, có nghĩa là việc chuyển các tập lệnh Bash sang “ngôn ngữ rắn” đôi khi trở thành một nhiệm vụ phức tạp và không hề tầm thường.

Để giúp cuộc sống của các nhà phát triển trở nên dễ dàng hơn, nhiều thư viện và tiện ích hữu ích trong Python đã được tạo và tiếp tục được tạo. Bài viết này mô tả hai thư viện mới được tạo bởi tác giả của bài đăng này - thông minh-env и vỏ trăn - và được thiết kế để giúp các nhà phát triển không cần phải chú ý nhiều đến sự phức tạp khi làm việc với Python, nhường chỗ cho các nhiệm vụ thú vị hơn. Phạm vi hoạt động của thư viện là biến môi trường và khởi chạy các tiện ích bên ngoài.

Ai quan tâm vui lòng xem mèo.

"Xe đạp" mới?

Có vẻ như tại sao lại tạo ra các gói mới cho các hoạt động khá bình thường? Điều gì ngăn cản bạn sử dụng trực tiếp os.environ và subprocess.<method or class of your choose>?

Tôi sẽ cung cấp bằng chứng ủng hộ từng thư viện một cách riêng biệt.

thư viện thông minh-env

Trước khi viết đứa con tinh thần của riêng mình, sẽ rất hữu ích nếu bạn lên mạng và tìm kiếm các giải pháp làm sẵn. Tất nhiên, có nguy cơ không tìm thấy thứ bạn cần, nhưng đây đúng hơn là một “sự kiện bảo hiểm”. Về nguyên tắc, cách tiếp cận này hiệu quả và tiết kiệm rất nhiều thời gian và công sức.

theo như kết quả Tìm kiếm điều sau đây đã được tiết lộ:

  • có những gói thực sự bao bọc các lệnh gọi tới os.environ, nhưng đồng thời yêu cầu một loạt hành động gây mất tập trung (tạo một phiên bản của một lớp, các tham số đặc biệt trong các lệnh gọi, v.v.);
  • Tuy nhiên, có những gói tốt được gắn chặt với một hệ sinh thái cụ thể (chủ yếu là các khung web như Django) và do đó không thể phổ biến nếu không có tệp;
  • có những nỗ lực hiếm hoi để làm điều gì đó mới mẻ. Ví dụ, thêm cách gõ và phân tích rõ ràng các giá trị biến bằng cách gọi các phương thức như
    get_<typename>(var_name)

    Hoặc ở đây một giải pháp nữa, tuy nhiên, nó không hỗ trợ Python 2 hiện đang bị thất sủng (mặc dù RIP chính thức, vẫn còn hàng núi mã viết và toàn bộ hệ sinh thái);

  • Có những sản phẩm thủ công của học sinh, vì một lý do nào đó không rõ, đã rơi vào PyPI ngược dòng và chỉ gây ra vấn đề với việc đặt tên cho các gói mới (đặc biệt, cái tên “smart-env” là một biện pháp cần thiết).

Và danh sách này có thể tiếp tục trong một thời gian dài. Tuy nhiên, những điểm trên đủ khiến tôi hào hứng với ý tưởng tạo ra thứ gì đó tiện lợi và phổ biến.

Các yêu cầu đã được đặt ra trước khi viết smart-env:

  • Sơ đồ sử dụng đơn giản nhất
  • Hỗ trợ gõ dữ liệu dễ dàng cấu hình
  • Tương thích Python 2.7
  • Bảo hiểm mã tốt bằng các bài kiểm tra

Cuối cùng, tất cả điều này đã được thực hiện. Đây là một ví dụ về việc sử dụng:

from smart_env import ENV

print(ENV.HOME)  # Equals print(os.environ['HOME'])

# assuming you set env variable MYVAR to "True"

ENV.enable_automatic_type_cast()

my_var = ENV.MY_VAR  # Equals boolean True

ENV.NEW_VAR = 100  # Sets a new environment variable

Như bạn có thể thấy từ ví dụ, để làm việc với một lớp mới, bạn chỉ cần nhập nó (bạn không cần tạo một phiên bản - trừ hành động bổ sung). Có thể truy cập vào bất kỳ biến môi trường nào bằng cách coi nó như một biến của lớp ENV, trên thực tế, làm cho lớp này trở thành một trình bao bọc trực quan cho môi trường hệ thống gốc, đồng thời biến nó thành một đối tượng cấu hình khả thi cho hầu hết mọi hệ thống ( chẳng hạn, một cách tiếp cận tương tự đã đạt được ở Django, chỉ có đối tượng cấu hình là chính mô-đun/gói cài đặt).

Việc bật/tắt chế độ hỗ trợ gõ tự động được thực hiện bằng hai phương pháp - Enable_automatic_type_cast() và vô hiệu hóa_automatic_type_cast(). Điều này có thể thuận tiện nếu biến môi trường chứa một đối tượng giống JSON được tuần tự hóa hoặc thậm chí chỉ là một hằng số Boolean (việc đặt rõ ràng biến DEBUG trong Django bằng cách so sánh biến môi trường với các chuỗi “hợp lệ” là một trong những trường hợp phổ biến nhất). Nhưng bây giờ không cần phải chuyển đổi chuỗi một cách rõ ràng - hầu hết các hành động cần thiết đã được nhúng sâu vào thư viện và chỉ chờ tín hiệu hành động. 🙂 Nói chung, tính năng gõ hoạt động minh bạch và hỗ trợ hầu hết tất cả các loại dữ liệu tích hợp sẵn (frozenset, complex và byte chưa được kiểm tra).

Yêu cầu hỗ trợ Python 2 đã được triển khai mà hầu như không có sự hy sinh nào (việc loại bỏ việc gõ phím và một số “kẹo đường” của các phiên bản mới nhất của Python 3), đặc biệt, nhờ có sáu tính năng phổ biến (để giải quyết các vấn đề khi sử dụng siêu dữ liệu) ).

Nhưng có một số hạn chế:

  • Hỗ trợ Python 3 có nghĩa là phiên bản 3.5 trở lên (sự hiện diện của chúng trong dự án của bạn là kết quả của sự lười biếng hoặc thiếu nhu cầu cải tiến, vì rất khó để đưa ra lý do khách quan tại sao bạn vẫn ở phiên bản 3.4);
  • Trong Python 2.7, thư viện không hỗ trợ giải tuần tự hóa các giá trị cố định. Sự miêu tả đây. Nhưng nếu có ai muốn thực hiện nó thì cũng được hoan nghênh :);

Thư viện còn có cơ chế ngoại lệ trong trường hợp xảy ra lỗi phân tích cú pháp. Nếu bất kỳ máy phân tích có sẵn nào không thể nhận ra chuỗi thì giá trị vẫn là một chuỗi (đúng hơn là vì lý do thuận tiện và tương thích ngược với logic thông thường về cách các biến hoạt động trong Bash).

thư viện python-shell

Bây giờ tôi sẽ kể cho bạn về thư viện thứ hai (Tôi sẽ bỏ qua phần mô tả về những thiếu sót của các thư viện tương tự hiện có - nó tương tự như thư viện được mô tả cho Smart-env. Analogues - đây и đây).

Nhìn chung, ý tưởng triển khai và các yêu cầu đối với nó tương tự như những gì được mô tả cho smart-env, như có thể thấy từ ví dụ:

from python_shell import Shell

Shell.ls('-l', '$HOME')  # Equals "ls -l $HOME"

command = Shell.whoami()  # Equals "whoami"
print(command.output)  # prints your current user name

print(command.command)  # prints "whoami"
print(command.return_code)  # prints "0"
print(command.arguments)  # prints ""

Shell.mkdir('-p', '/tmp/new_folder')  # makes a new folder

Ý tưởng là thế này:

  1. Một lớp duy nhất đại diện cho Bash trong thế giới Python;
  2. Mỗi lệnh Bash được gọi như một hàm của lớp Shell;
  3. Sau đó, các tham số cho mỗi lệnh gọi hàm được chuyển vào lệnh gọi lệnh Bash tương ứng;
  4. Mỗi lệnh được thực thi “ở đây và bây giờ” tại thời điểm nó được gọi, tức là. cách tiếp cận đồng bộ có hiệu quả;
  5. có thể truy cập đầu ra của một lệnh trong thiết bị xuất chuẩn, cũng như mã trả về của nó;
  6. Nếu lệnh không có trong hệ thống, một ngoại lệ sẽ được đưa ra.

Giống như smart-env, có hỗ trợ cho Python 2 (mặc dù cần thêm một chút máu hy sinh) và không hỗ trợ cho Python 3.0-3.4.

Kế hoạch phát triển thư viện

Bạn có thể sử dụng các thư viện ngay bây giờ: cả hai đều được đăng trên PyPI chính thức. Nguồn có sẵn trên Github (xem bên dưới).

Cả hai thư viện sẽ được phát triển dựa trên phản hồi được thu thập từ những người quan tâm. Và, nếu khó có thể đưa ra nhiều tính năng mới trong smart-env, thì trong python-shell chắc chắn có một số tính năng khác cần thêm vào:

  • hỗ trợ cuộc gọi không chặn;
  • khả năng giao tiếp tương tác với nhóm (làm việc với stdin);
  • thêm thuộc tính mới (ví dụ: thuộc tính nhận đầu ra từ stderr);
  • triển khai một thư mục các lệnh có sẵn (để sử dụng với hàm dir());
  • vv

tài liệu tham khảo

  1. thư viện thông minh-env: Github и PyPI
  2. thư viện python-shell: Github и PyPI
  3. Kênh Telegram cập nhật thư viện

CẬP NHẬT 23.02.2020:
* Kho đã được di chuyển, các liên kết tương ứng đã được cập nhật
* Phiên bản python-shell==1.0.1 đang được chuẩn bị phát hành vào ngày 29.02.2020/XNUMX/XNUMX. Các thay đổi bao gồm hỗ trợ tự động hoàn thành lệnh và lệnh dir(Shell), chạy các lệnh có mã định danh Python không hợp lệ và sửa lỗi.

Nguồn: www.habr.com

Thêm một lời nhận xét