การสร้างมิตรภาพ Python และ Bash: ไลบรารี smart-env และ python-shell

ขอให้เป็นวันที่ดีทุกคน

ปัจจุบัน Python เป็นหนึ่งในภาษาที่ใช้มากที่สุดในด้านการสร้างไม่เพียงแต่ผลิตภัณฑ์ซอฟต์แวร์เท่านั้น แต่ยังรวมถึงโครงสร้างพื้นฐานด้วย เป็นผลให้ devops จำนวนมากไม่ว่าจะโดยความตั้งใจหรือขัดขืนก็ตามต้องเรียนรู้ภาษาใหม่เพื่อใช้ในภายหลังเป็นส่วนเสริมของสคริปต์ Bash แบบเก่าที่ดี อย่างไรก็ตาม Bash และ Python ยอมรับแนวทางการเขียนโค้ดที่แตกต่างกันและมีคุณสมบัติบางอย่าง ซึ่งหมายความว่าการย้ายสคริปต์ Bash ไปเป็น "ภาษางู" บางครั้งกลายเป็นงานที่กว้างขวางและห่างไกลจากงานที่ไม่สำคัญ

เพื่อให้ชีวิตง่ายขึ้นสำหรับ Devops จึงมีการสร้างไลบรารีและยูทิลิตี้ที่มีประโยชน์มากมายใน Python และยังคงสร้างต่อไป บทความนี้จะอธิบายห้องสมุดใหม่สองแห่งที่สร้างโดยผู้เขียนโพสต์นี้ - สมาร์ท-env и หลามเปลือก - และได้รับการออกแบบมาเพื่อลดความจำเป็นในการให้ความสนใจอย่างมากกับความซับซ้อนของการทำงานกับ Python ทำให้เหลือพื้นที่สำหรับงานที่น่าสนใจมากขึ้น ขอบเขตของกิจกรรมของห้องสมุดคือตัวแปรสภาพแวดล้อมและการเปิดตัวยูทิลิตี้ภายนอก

ใครสนใจเข้าไปดูแมวได้นะครับ

“จักรยาน” ใหม่เหรอ?

ดูเหมือนว่าทำไมต้องสร้างแพ็คเกจใหม่สำหรับการดำเนินงานที่ค่อนข้างธรรมดา? อะไรขัดขวางไม่ให้คุณใช้ os.environ และ subprocess.<method or class of your choice> โดยตรง

ฉันจะจัดทำหลักฐานสนับสนุนห้องสมุดแต่ละแห่งแยกกัน

ไลบรารี่ smart-env

ก่อนที่จะเขียนผลิตผลของคุณเอง คุณควรออนไลน์และค้นหาวิธีแก้ปัญหาสำเร็จรูปก่อน แน่นอนว่ามีความเสี่ยงที่จะไม่พบสิ่งที่คุณต้องการ แต่นี่ค่อนข้างเป็น "เหตุการณ์ประกันภัย" ตามกฎแล้ว วิธีการนี้ใช้ได้ผลและประหยัดเวลาและความพยายามได้มาก

ตามผลลัพธ์ ค้นหา มีการเปิดเผยดังต่อไปนี้:

  • มีแพ็คเกจที่ตัดการโทรไปยัง os.environ จริง ๆ แต่ในขณะเดียวกันก็ต้องการการดำเนินการที่กวนใจมากมาย (การสร้างอินสแตนซ์ของคลาส พารามิเตอร์พิเศษในการโทร ฯลฯ );
  • มีแพ็คเกจที่ดีซึ่งเชื่อมโยงกับระบบนิเวศเฉพาะอย่างเคร่งครัด (ส่วนใหญ่เป็นเฟรมเวิร์กเว็บเช่น Django) ดังนั้นจึงไม่เป็นสากลเลยหากไม่มีไฟล์
  • มีความพยายามที่จะทำสิ่งใหม่ๆ เกิดขึ้นไม่บ่อยนัก ตัวอย่างเช่น, เพิ่มการพิมพ์ และแยกวิเคราะห์ค่าตัวแปรอย่างชัดเจนโดยการเรียกเมธอดเช่น
    get_<typename>(var_name)

    หรือที่นี่ อีกหนึ่งทางออกซึ่งอย่างไรก็ตามไม่รองรับ Python 2 ที่น่าอับอายในขณะนี้ (ซึ่งแม้จะมี RIP อย่างเป็นทางการยังคงมีโค้ดเขียนมากมายและระบบนิเวศทั้งหมด)

  • มีงานฝีมือของนักเรียนในโรงเรียนที่ลงเอยที่อัปสตรีม PyPI ด้วยเหตุผลบางประการ และสร้างปัญหากับการตั้งชื่อแพ็คเกจใหม่เท่านั้น (โดยเฉพาะชื่อ "smart-env" เป็นมาตรการที่จำเป็น)

และรายการนี้สามารถดำเนินต่อไปได้เป็นเวลานาน อย่างไรก็ตาม ประเด็นข้างต้นก็เพียงพอที่จะทำให้ฉันตื่นเต้นกับแนวคิดในการทำสิ่งที่สะดวกและเป็นสากล

ข้อกำหนดที่ตั้งไว้ก่อนที่จะเขียน smart-env:

  • รูปแบบการใช้งานที่ง่ายที่สุด
  • รองรับการพิมพ์ข้อมูลที่กำหนดค่าได้ง่าย
  • เข้ากันได้กับหลาม 2.7
  • การครอบคลุมโค้ดที่ดีจากการทดสอบ

ในที่สุดทั้งหมดนี้ก็เป็นจริง นี่คือตัวอย่างการใช้งาน:

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

ดังที่คุณเห็นจากตัวอย่าง หากต้องการทำงานกับคลาสใหม่ คุณเพียงแค่ต้องนำเข้าคลาสนั้น (คุณไม่จำเป็นต้องสร้างอินสแตนซ์ - ลบการดำเนินการเพิ่มเติม) การเข้าถึงตัวแปรสภาพแวดล้อมใดๆ ทำได้โดยการอ้างอิงตัวแปรดังกล่าวว่าเป็นตัวแปรของคลาส ENV ซึ่งทำให้คลาสนี้เป็น wrapper ที่ใช้งานง่ายสำหรับสภาพแวดล้อมของระบบดั้งเดิม ในขณะเดียวกันก็เปลี่ยนให้เป็นออบเจ็กต์การกำหนดค่าที่เป็นไปได้สำหรับเกือบทุกระบบ ( ตัวอย่างเช่นวิธีการที่คล้ายกันสามารถทำได้ใน Django มีเพียงออบเจ็กต์การกำหนดค่าเท่านั้นที่เป็นโมดูลการตั้งค่า/แพ็คเกจเอง)

การเปิดใช้งาน/ปิดใช้งานโหมดสนับสนุนการพิมพ์อัตโนมัติทำได้โดยใช้สองวิธี - Enable_automatic_type_cast() และ Disable_automatic_type_cast() วิธีนี้จะสะดวกหากตัวแปรสภาพแวดล้อมมีออบเจ็กต์คล้าย JSON ที่ทำให้เป็นอนุกรม หรือแม้แต่ค่าคงที่บูลีน (การตั้งค่าตัวแปร DEBUG ใน Django อย่างชัดเจนโดยการเปรียบเทียบตัวแปรสภาพแวดล้อมกับสตริงที่ “ถูกต้อง” เป็นหนึ่งในกรณีที่พบบ่อยที่สุด) แต่ตอนนี้ไม่จำเป็นต้องแปลงสตริงอย่างชัดเจน - การดำเนินการที่จำเป็นส่วนใหญ่ฝังอยู่ในส่วนลึกของไลบรารีแล้วและกำลังรอให้สัญญาณดำเนินการ 🙂 โดยทั่วไป การพิมพ์จะทำงานได้อย่างโปร่งใสและรองรับประเภทข้อมูลในตัวที่มีอยู่เกือบทั้งหมด (ไม่ได้ทดสอบการแช่แข็ง ซับซ้อน และไบต์)

ข้อกำหนดในการรองรับ Python 2 ได้รับการนำไปใช้โดยแทบไม่ต้องเสียสละ (การละทิ้งการพิมพ์และ "ลูกอมน้ำตาล" บางส่วนของ Python 3 เวอร์ชันล่าสุด) โดยเฉพาะอย่างยิ่งต้องขอบคุณหกที่แพร่หลาย (เพื่อแก้ปัญหาของการใช้ metaclasses ).

แต่มีข้อจำกัดบางประการ:

  • การรองรับ Python 3 หมายถึงเวอร์ชัน 3.5 และสูงกว่า (การมีอยู่ในโครงการของคุณเป็นผลมาจากความเกียจคร้านหรือขาดความจำเป็นในการปรับปรุงเนื่องจากเป็นการยากที่จะหาเหตุผลที่เป็นรูปธรรมว่าทำไมคุณถึงยังใช้ 3.4)
  • ใน Python 2.7 ไลบรารีไม่รองรับการดีซีเรียลไลซ์ของชุดตัวอักษร คำอธิบาย ที่นี่. แต่ถ้าใครอยากนำไปปฏิบัติก็ยินดีครับ :);

ไลบรารียังมีกลไกข้อยกเว้นในกรณีที่เกิดข้อผิดพลาดในการแยกวิเคราะห์ หากเครื่องวิเคราะห์ที่มีอยู่ไม่รู้จักสตริง ค่านั้นจะยังคงเป็นสตริง (แต่เพื่อความสะดวกและความเข้ากันได้แบบย้อนหลังกับตรรกะปกติของการทำงานของตัวแปรใน Bash)

ไลบรารีหลามเชลล์

ตอนนี้ฉันจะบอกคุณเกี่ยวกับไลบรารีที่สอง (ฉันจะละเว้นคำอธิบายข้อบกพร่องของอะนาล็อกที่มีอยู่ - มันคล้ายกับที่อธิบายไว้สำหรับ smart-env อะนาล็อก - ที่นี่ и ที่นี่).

โดยทั่วไปแนวคิดในการนำไปปฏิบัติและข้อกำหนดนั้นคล้ายคลึงกับแนวคิดที่อธิบายไว้สำหรับ smart-env ดังที่เห็นได้จากตัวอย่าง:

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

แนวคิดคือ:

  1. คลาสเดียวที่แสดงถึง Bash ในโลก Python
  2. คำสั่ง Bash แต่ละคำสั่งถูกเรียกว่าเป็นฟังก์ชันของคลาส Shell
  3. พารามิเตอร์สำหรับการเรียกใช้ฟังก์ชันแต่ละครั้งจะถูกส่งผ่านไปยังการเรียกคำสั่ง Bash ที่สอดคล้องกัน
  4. แต่ละคำสั่งจะถูกดำเนินการ "ที่นี่และเดี๋ยวนี้" ในเวลาที่เรียกว่านั่นคือ วิธีการซิงโครนัสใช้งานได้
  5. สามารถเข้าถึงเอาต์พุตของคำสั่งใน stdout รวมถึงโค้ดส่งคืนได้
  6. หากคำสั่งไม่อยู่ในระบบ ข้อยกเว้นจะเกิดขึ้น

เช่นเดียวกับ smart-env มีการรองรับ Python 2 (แม้ว่าจะต้องใช้เลือดสังเวยเพิ่มอีกเล็กน้อย) และไม่มีการรองรับ Python 3.0-3.4

แผนพัฒนาห้องสมุด

คุณสามารถใช้ไลบรารี่ได้ทันที: ทั้งคู่โพสต์บน PyPI อย่างเป็นทางการ แหล่งที่มามีอยู่ใน Github (ดูด้านล่าง)

ห้องสมุดทั้งสองแห่งจะได้รับการพัฒนาโดยคำนึงถึงความคิดเห็นที่รวบรวมมาจากผู้สนใจ และถ้ามันอาจเป็นเรื่องยากที่จะเกิดขึ้นกับฟีเจอร์ใหม่ที่หลากหลายใน smart-env ดังนั้นใน python-shell ก็มีสิ่งอื่นเพิ่มเติมอย่างแน่นอน:

  • รองรับการโทรแบบไม่บล็อค
  • ความเป็นไปได้ของการสื่อสารแบบโต้ตอบกับทีม (ทำงานกับ stdin)
  • การเพิ่มคุณสมบัติใหม่ (เช่น คุณสมบัติในการรับเอาต์พุตจาก stderr)
  • การใช้งานไดเร็กทอรีของคำสั่งที่มีอยู่ (สำหรับใช้กับฟังก์ชัน dir())
  • เป็นต้น

การอ้างอิง

  1. ไลบรารี่ smart-env: Github и PyPI
  2. ไลบรารีหลามเชลล์: Github и PyPI
  3. ช่องโทรเลข การอัปเดตห้องสมุด

อัปเดต 23.02.2020:
* ที่เก็บถูกย้ายแล้ว ลิงก์ที่เกี่ยวข้องได้รับการอัปเดตแล้ว
* เวอร์ชัน python-shell==1.0.1 กำลังเตรียมพร้อมสำหรับการเปิดตัวในวันที่ 29.02.2020/XNUMX/XNUMX การเปลี่ยนแปลงรวมถึงการสนับสนุนคำสั่งเติมข้อความอัตโนมัติและคำสั่ง dir (Shell) การรันคำสั่งด้วยตัวระบุ Python ที่ไม่ถูกต้อง และการแก้ไขข้อบกพร่อง

ที่มา: will.com

เพิ่มความคิดเห็น