ขอให้เป็นวันที่ดีทุกคน
ปัจจุบัน Python เป็นหนึ่งในภาษาที่ใช้มากที่สุดในด้านการสร้างไม่เพียงแต่ผลิตภัณฑ์ซอฟต์แวร์เท่านั้น แต่ยังรวมถึงโครงสร้างพื้นฐานด้วย เป็นผลให้ devops จำนวนมากไม่ว่าจะโดยความตั้งใจหรือขัดขืนก็ตามต้องเรียนรู้ภาษาใหม่เพื่อใช้ในภายหลังเป็นส่วนเสริมของสคริปต์ Bash แบบเก่าที่ดี อย่างไรก็ตาม Bash และ Python ยอมรับแนวทางการเขียนโค้ดที่แตกต่างกันและมีคุณสมบัติบางอย่าง ซึ่งหมายความว่าการย้ายสคริปต์ Bash ไปเป็น "ภาษางู" บางครั้งกลายเป็นงานที่กว้างขวางและห่างไกลจากงานที่ไม่สำคัญ
เพื่อให้ชีวิตง่ายขึ้นสำหรับ Devops จึงมีการสร้างไลบรารีและยูทิลิตี้ที่มีประโยชน์มากมายใน 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
แนวคิดคือ:
- คลาสเดียวที่แสดงถึง Bash ในโลก Python
- คำสั่ง Bash แต่ละคำสั่งถูกเรียกว่าเป็นฟังก์ชันของคลาส Shell
- พารามิเตอร์สำหรับการเรียกใช้ฟังก์ชันแต่ละครั้งจะถูกส่งผ่านไปยังการเรียกคำสั่ง Bash ที่สอดคล้องกัน
- แต่ละคำสั่งจะถูกดำเนินการ "ที่นี่และเดี๋ยวนี้" ในเวลาที่เรียกว่านั่นคือ วิธีการซิงโครนัสใช้งานได้
- สามารถเข้าถึงเอาต์พุตของคำสั่งใน stdout รวมถึงโค้ดส่งคืนได้
- หากคำสั่งไม่อยู่ในระบบ ข้อยกเว้นจะเกิดขึ้น
เช่นเดียวกับ smart-env มีการรองรับ Python 2 (แม้ว่าจะต้องใช้เลือดสังเวยเพิ่มอีกเล็กน้อย) และไม่มีการรองรับ Python 3.0-3.4
แผนพัฒนาห้องสมุด
คุณสามารถใช้ไลบรารี่ได้ทันที: ทั้งคู่โพสต์บน PyPI อย่างเป็นทางการ แหล่งที่มามีอยู่ใน Github (ดูด้านล่าง)
ห้องสมุดทั้งสองแห่งจะได้รับการพัฒนาโดยคำนึงถึงความคิดเห็นที่รวบรวมมาจากผู้สนใจ และถ้ามันอาจเป็นเรื่องยากที่จะเกิดขึ้นกับฟีเจอร์ใหม่ที่หลากหลายใน smart-env ดังนั้นใน python-shell ก็มีสิ่งอื่นเพิ่มเติมอย่างแน่นอน:
- รองรับการโทรแบบไม่บล็อค
- ความเป็นไปได้ของการสื่อสารแบบโต้ตอบกับทีม (ทำงานกับ stdin)
- การเพิ่มคุณสมบัติใหม่ (เช่น คุณสมบัติในการรับเอาต์พุตจาก stderr)
- การใช้งานไดเร็กทอรีของคำสั่งที่มีอยู่ (สำหรับใช้กับฟังก์ชัน dir())
- เป็นต้น
การอ้างอิง
- ไลบรารี่ smart-env:
Github иPyPI - ไลบรารีหลามเชลล์:
Github иPyPI ช่องโทรเลข การอัปเดตห้องสมุด
อัปเดต 23.02.2020:
* ที่เก็บถูกย้ายแล้ว ลิงก์ที่เกี่ยวข้องได้รับการอัปเดตแล้ว
* เวอร์ชัน python-shell==1.0.1 กำลังเตรียมพร้อมสำหรับการเปิดตัวในวันที่ 29.02.2020/XNUMX/XNUMX การเปลี่ยนแปลงรวมถึงการสนับสนุนคำสั่งเติมข้อความอัตโนมัติและคำสั่ง dir (Shell) การรันคำสั่งด้วยตัวระบุ Python ที่ไม่ถูกต้อง และการแก้ไขข้อบกพร่อง
ที่มา: will.com