วิธีการใช้สำนวนทุบตีทั่วไปใน Python? [ปิด]


242

ขณะนี้ฉันทำการจัดการไฟล์ข้อความผ่าน AWK, sed, Bash และ Perl นิด ๆ

ฉันเคยเห็นพูดถึงสถานที่บางแห่งที่หลามดีสำหรับสิ่งนี้ ฉันจะใช้ Python เพื่อแทนที่ shell scripting, AWK, sed และ Friends ได้อย่างไร


3
pythonpy เป็นคู่แข่งที่ดีสำหรับ awk และ sed โดยใช้ python syntax: github.com/Russell91/pythonpy
RussellStewart

4
คุณสามารถใช้ shellpy ที่ได้รับการออกแบบด้วยความคิดเพื่อแทนที่ bash / sh ด้วย python github.com/lamerman/shellpy
Alexander Ponomarev

นี่คือคำถามของฉันฉันไม่เข้าใจว่าทำไมมันถึงมีความคิดเห็น คำตอบยอดนิยมแสดงรายการสิ่งสำคัญแต่ละอย่างที่เชลล์ทำและบอกคุณถึงวิธีการใช้งานในไพ ธ อน ในความคิดของฉันตอบคำถามในลักษณะที่ไม่ใช่ความคิดเห็น
Chris Jefferson

คำถามนี้และจะปิดตัวลงกำลังมีการหารือเกี่ยวกับเมตาที่นี่
Erik A

คำตอบ:


144

เชลล์ใด ๆ มีคุณสมบัติหลายชุด

  • คำสั่ง Essential Linux / Unix ทั้งหมดนี้มีอยู่ในไลบรารีย่อย นี่ไม่ใช่ตัวเลือกแรกที่ดีที่สุดสำหรับการทำคำสั่งภายนอกทั้งหมด ดูที่Shutilสำหรับคำสั่งบางคำซึ่งเป็นคำสั่ง Linux แยกกัน แต่คุณอาจนำไปใช้โดยตรงในสคริปต์ Python ของคุณ อีกชุดคำสั่ง Linux ขนาดใหญ่อยู่ในไลบรารีระบบปฏิบัติการ คุณสามารถทำสิ่งเหล่านี้ได้ง่ายขึ้นใน Python

    และ - โบนัส! -- เร็วกว่านี้. แต่ละคำสั่ง Linux ที่แยกต่างหากในเชลล์ (โดยมีข้อยกเว้นเล็กน้อย) จะระงับกระบวนการย่อย โดยใช้ Python shutilและosโมดูลคุณจะไม่แยกกระบวนการย่อย

  • คุณสมบัติสภาพแวดล้อมของเชลล์ ซึ่งรวมถึงสิ่งต่าง ๆ ที่ตั้งค่าสภาพแวดล้อมของคำสั่ง (ไดเรกทอรีปัจจุบันและตัวแปรสภาพแวดล้อมและสิ่งที่ไม่ใช่) คุณสามารถจัดการสิ่งนี้ได้จาก Python โดยตรง

  • คุณสมบัติการเขียนโปรแกรมเชลล์ นี่คือการตรวจสอบรหัสสถานะกระบวนการทั้งหมดคำสั่งตรรกะต่างๆ (ถ้าในขณะสำหรับ ฯลฯ ) คำสั่งทดสอบและญาติทั้งหมด สิ่งที่นิยามฟังก์ชั่น นี่คือทั้งหมดที่มากขึ้นง่ายขึ้นใน Python นี่เป็นหนึ่งในชัยชนะอันยิ่งใหญ่ในการกำจัดทุบตีและทำมันใน Python

  • คุณสมบัติการโต้ตอบ ซึ่งรวมถึงประวัติคำสั่งและสิ่งที่ไม่ คุณไม่ต้องการสิ่งนี้สำหรับการเขียนเชลล์สคริปต์ สิ่งนี้มีไว้สำหรับการโต้ตอบของมนุษย์เท่านั้นไม่ใช่สำหรับการเขียนสคริปต์

  • คุณสมบัติการจัดการไฟล์เชลล์ ซึ่งรวมถึงการเปลี่ยนเส้นทางและไปป์ไลน์ นี่มันช่างเขินนะ สิ่งเหล่านี้สามารถทำได้ด้วยกระบวนการย่อย แต่บางสิ่งที่เปลือกหอยง่ายใน Python (a | b; c ) | something >resultโดยเฉพาะสิ่งที่ชอบ สิ่งนี้จะทำงานสองกระบวนการในแบบคู่ขนาน (โดยมีเอาต์พุตaเป็นอินพุตไปยังb) ตามด้วยกระบวนการที่สาม เอาท์พุทจากลำดับที่จะดำเนินการควบคู่ไปกับการและการส่งออกจะถูกรวบรวมเป็นไฟล์ที่ชื่อว่าsomething resultมันซับซ้อนมากที่จะแสดงเป็นภาษาอื่น

โปรแกรมเฉพาะ (awk, sed, grep และอื่น ๆ ) สามารถเขียนใหม่เป็นโมดูล Python อย่าไปลงน้ำ แทนที่สิ่งที่คุณต้องการและพัฒนาโมดูล "grep" ของคุณ อย่าเริ่มเขียนโมดูล Python ที่แทนที่ "grep"

สิ่งที่ดีที่สุดคือคุณสามารถทำได้ในขั้นตอน

  1. แทนที่ AWK และ PERL ด้วย Python ทิ้งทุกอย่างไว้คนเดียว
  2. ดูการแทนที่ GREP ด้วย Python สิ่งนี้อาจซับซ้อนกว่านี้เล็กน้อย แต่รุ่นของ GREP สามารถปรับให้เข้ากับความต้องการในการประมวลผลของคุณได้
  3. ดูที่การเปลี่ยน FIND os.walkกับงูหลามลูปการใช้งานที่ นี่เป็นชัยชนะครั้งใหญ่เพราะคุณไม่ได้วางไข่เป็นจำนวนมาก
  4. ดูการแทนที่ตรรกะเชลล์ทั่วไป (ลูปการตัดสินใจ ฯลฯ ) ด้วยสคริปต์ Python

6
wrote: "ฟีเจอร์การโต้ตอบซึ่งรวมถึงประวัติคำสั่งและสิ่งที่ไม่ใช่คุณไม่ต้องการสิ่งนี้" ฉันเกรงว่าจะไม่มีใครสามารถบอกได้ว่าบุคคลนั้นต้องการจริงๆหรือไม่ บางทีเขาทำ นอกจากนี้สิ่งอำนวยความสะดวกเหล่านี้มีความหมายอย่างมากในเชลล์แบบโต้ตอบซึ่งเป็นตัวอย่างที่แตกต่างระหว่าง Idle และ IPython
heltonbiker

47
ฉันขอแสดงความนับถือผู้คนจะคลองเชลล์สคริปต์ทั้งหมด ฉันเข้าใจว่าการแฮ็คนั้นเป็นศาสนาในโลก * แต่ฉันรู้สึกเบื่อหน่ายกับการพยายามตีความวิธีการแฮ็กทั้งหมดที่ฝังอยู่ในระบบปฏิบัติการ ความแปลกใหม่ของ microtools (awk, sed, top, base และอื่น ๆ ) หมดวันที่ทุกคนตัดสินใจที่จะพลิกเวอร์ชั่นของตัวเอง ฉันประจบประแจงเมื่อฉันนึกภาพจำนวนชั่วโมงคนเสียไปกับเครื่องมือเล็ก ๆ น้อย ๆ ที่เส็งเคร็งซึ่งสามารถแทนที่ได้ง่ายด้วยโมดูล Python ที่ออกแบบมาเป็นอย่างดี :: ถอนหายใจ ::
Evan Plaice

40
ฉันไม่เห็นด้วย @EvanPlaice เพราะเวอร์ชันหลามของfindสคริปต์หลายตัวที่ฉันมีนั้นน่าเกลียดและยาวและไม่สามารถเปรียบเทียบได้ หลายสิ่งหลายอย่างที่ควรจะเป็นเชลล์สคริปต์อื่น ๆ อีกมากมายไม่ควร ไม่ใช่ทุกสิ่งที่จำเป็นต้องเป็นเพียงหนึ่งใน Python หรือ BASH (หรืออย่างอื่น)
mikebabcock

8
@mikebabcock โดยพื้นฐานแล้วจะมีไลบรารีที่สมบูรณ์ซึ่งใช้เครื่องมือไมโครทั้งหมดที่มีให้โดย stack * nix พื้นฐาน ฟังก์ชั่นเช่น find () และ last () จะถูกรวมไว้และแทนที่จะเป็นท่อการผสมผสานระหว่าง currying และ lazy-loading จะจัดการกับการติดกาวทั้งหมดเข้าด้วยกัน มันจะดีหรือไม่ถ้ามีสภาพแวดล้อมการเขียนสคริปต์ POSIX ที่ทำงานได้ดีในทุก ๆ distros? ยังไม่มีอะไรที่เหมือนอยู่ แต่ ...
Evan Plaice

2
จุดเกี่ยวกับท่อเปลือก (เช่น(a | b; c ) | something >result) ค่อนข้างบรรเทาโดยมันง่ายนิดเดียวผ่านเปลือกท่อไปยังsubprocessวิธีการใช้shell=True
iruvar

103

ใช่แน่นอน :)

ลองดูไลบรารี่เหล่านี้ซึ่งจะช่วยให้คุณไม่ต้องเขียนเชลล์สคริปต์อีกครั้ง (คำขวัญของ Plumbum)

นอกจากนี้หากคุณต้องการแทนที่ awk, sed และ grep ด้วย Python ตามสิ่งที่ฉันแนะนำpyp -

"The Pyed Piper" หรือ pyp เป็นเครื่องมือจัดการข้อความบนบรรทัดคำสั่ง linux ซึ่งคล้ายกับ awk หรือ sed แต่ใช้สตริงไพ ธ อนมาตรฐานและรายการวิธีการเช่นเดียวกับฟังก์ชั่นที่กำหนดเองที่พัฒนาเพื่อสร้างผลลัพธ์ที่รวดเร็วในสภาพแวดล้อมการผลิตที่เข้มข้น


ดูที่ Envoy ซึ่งเป็นทางเลือกแทน sh github.com/kennethreitz/envoy
AllanLRH

57

ฉันเพิ่งค้นพบวิธีการรวมส่วนที่ดีที่สุดของ bash และ ipython ถึงตอนนี้ฉันรู้สึกสบายใจกว่าใช้ subprocess และอื่น ๆ คุณสามารถคัดลอกส่วนใหญ่ของสคริปต์ทุบตีที่มีอยู่และเช่นเพิ่มการจัดการข้อผิดพลาดด้วยวิธีหลาม :) และนี่คือผลลัพธ์ของฉัน:

#!/usr/bin/env ipython3

# *** How to have the most comfort scripting experience of your life ***
# ######################################################################
#
# … by using ipython for scripting combined with subcommands from bash!
#
# 1. echo "#!/usr/bin/env ipython3" > scriptname.ipy    # creates new ipy-file
#
# 2. chmod +x scriptname.ipy                            # make in executable
#
# 3. starting with line 2, write normal python or do some of
#    the ! magic of ipython, so that you can use unix commands
#    within python and even assign their output to a variable via
#    var = !cmd1 | cmd2 | cmd3                          # enjoy ;)
#
# 4. run via ./scriptname.ipy - if it fails with recognizing % and !
#    but parses raw python fine, please check again for the .ipy suffix

# ugly example, please go and find more in the wild
files = !ls *.* | grep "y"
for file in files:
  !echo $file | grep "p"
# sorry for this nonsense example ;)

ดูเอกสาร IPython ในคำสั่งเชลล์ระบบและใช้มันเป็นเปลือกระบบ


11
เพิ่มขึ้นเนื่องจากเหตุผลบางอย่างที่แปลกประหลาดไม่มีใครพูดถึง! - คำสั่งใน IPython ซึ่งเป็นกุญแจสำคัญ; โดยเฉพาะอย่างยิ่งเนื่องจากคุณสามารถกำหนดเอาท์พุทของพวกเขาให้กับตัวแปร (รายการของบรรทัด) เช่นเดียวกับในfilelines = ! cat myfile
kampu

และคุณสามารถใช้ตัวแปรหลาม$varในคำสั่งเชลล์ได้หรือไม่ ว้าว. นี่ควรเป็นคำตอบที่ยอมรับได้
Chiel ten Brinke

และคุณยังสามารถใช้งานได้จากภายในสมุดบันทึก jupyter
Yuval Atzmon

44

ตั้งแต่ปี 2015 และ Python 3.4 มีตอนนี้เชลล์แบบอินเทอร์แอคทีฟที่สมบูรณ์ที่ผู้ใช้สามารถดูได้ที่: http://xon.sh/หรือhttps://github.com/scopatz/xonsh

วิดีโอสาธิตไม่แสดงท่อถูกนำมาใช้ แต่พวกเขาได้รับการสนับสนุนเมื่ออยู่ในโหมดเปลือกเริ่มต้น

Xonsh ('conch') พยายามอย่างหนักที่จะเลียนแบบทุบตีดังนั้นสิ่งที่คุณได้รับความทรงจำของกล้ามเนื้อเช่นนั้น

env | uniq | sort -r | grep PATH

หรือ

my-web-server 2>&1 | my-log-sorter

จะยังคงทำงานได้ดี

การสอนมีความยาวมากและดูเหมือนจะครอบคลุมการใช้งานที่คนทั่วไปคาดหวังในระดับขี้เถ้าหรือทุบตี:

  • คอมไพล์ประเมินและดำเนินการ!
  • ประวัติคำสั่งและการทำให้แท็บสมบูรณ์
  • ช่วยเหลือ & ช่วยเหลือด้วย?&??
  • นามแฝง & พร้อมท์ที่กำหนดเอง
  • เรียกใช้คำสั่งและ / หรือ*.xshสคริปต์ซึ่งสามารถนำเข้าได้
  • ตัวแปรสภาพแวดล้อมรวมถึงการค้นหาด้วย ${}
  • การเปลี่ยนเส้นทางอินพุต / เอาต์พุตและการรวม
  • งานพื้นหลังและการควบคุมงาน
  • การทำ Subprocesses, Pipe และ Coprocesses
  • โหมดย่อยเมื่อคำสั่งอยู่, โหมด Python เป็นอย่างอื่น
  • จับกระบวนการย่อยที่มี$(), uncaptured subprocess กับ$[], การประเมินผลของ Python ด้วย@()
  • ชื่อไฟล์ Globbing กับ*หรือนิพจน์ปกติชื่อไฟล์ Globbing กับ Backticks

แต่ทำไมมันดูเหมือนว่าคำตอบเหล่านี้ทั้งหมดเป็นเพียงการสร้างใหม่ล้อสำหรับคนที่ไม่รู้จักทุบตี ? ฉันได้รับความสะดวกสบายในระดับปานกลางด้วยการทุบตีและคำตอบเหล่านี้ดูเหมือนจะจบลงด้วยการทำงานมากขึ้นเพื่อผลประโยชน์เพียงเล็กน้อย คำตอบเหล่านี้มีวัตถุประสงค์เพื่อคนที่หลามที่กลัว (หรือไม่ต้องการใช้เวลาในการเรียนรู้) ทุบตีฉันถูกไหม?
Buttle Butkus

ดูเหมือนว่ามันมีข้อเสียบางอย่างเช่นความต้องการที่จะใช้.xshส่วนขยายสำหรับไฟล์ที่มีรหัส xonsh นี้: github.com/xonsh/xonsh/issues/2478 มิฉะนั้นคุณต้องใช้evalxเพื่อโทรโดยตรงจาก.pyไฟล์
Andry

31
  • หากคุณต้องการใช้ Python เป็นเชลล์ทำไมไม่ลองดูIPythonล่ะ? นอกจากนี้ยังเป็นการดีที่จะเรียนรู้ภาษาแบบโต้ตอบ
  • หากคุณทำการปรับแต่งข้อความจำนวนมากและหากคุณใช้ Vim เป็นตัวแก้ไขข้อความคุณสามารถเขียนปลั๊กอินสำหรับ Vim ได้โดยตรงใน python เพียงพิมพ์ ": help python" ใน Vim แล้วทำตามคำแนะนำหรือดูที่การนำเสนอนี้ มันง่ายและมีประสิทธิภาพในการเขียนฟังก์ชั่นที่คุณจะใช้โดยตรงในโปรแกรมแก้ไขของคุณ!

8
มีรายละเอียด ipython เรียกว่า 'ดวลจุดโทษ' ที่ทำให้ล่ามมากเหมือนเปลือก
Autoplectic

3
โปรไฟล์ ip 'sh' ถูกลบออกไประยะหนึ่งแล้ว
gdw2

>>> ผล =! dmesg | grep -i 'usb' #the! ผู้ประกอบการทำได้ทุกอย่าง
Permafacture

16

ในตอนแรกมี sh, sed และ awk (และค้นหาและ grep และ ... ) มันดีนะ. แต่ awk อาจเป็นสัตว์ประหลาดตัวเล็ก ๆ และจำได้ยากหากคุณไม่ได้ใช้บ่อย จากนั้นอูฐผู้ยิ่งใหญ่ก็สร้าง Perl ขึ้น Perl เป็นความฝันของผู้ดูแลระบบ มันเหมือนกับการเขียนสคริปต์เชลล์บนเตียรอยด์ การประมวลผลข้อความรวมถึงนิพจน์ทั่วไปเป็นเพียงส่วนหนึ่งของภาษา จากนั้นมันก็น่าเกลียด ... ผู้คนพยายามสร้างแอพพลิเคชั่นขนาดใหญ่ด้วย Perl ตอนนี้อย่าเข้าใจฉันผิด Perl สามารถเป็นแอปพลิเคชันได้ แต่มันสามารถ (สามารถ!) ดูเหมือนเป็นระเบียบถ้าคุณไม่ระวังจริงๆ จากนั้นก็มีธุรกิจดาต้าแบนนี้ทั้งหมด มันเพียงพอแล้วที่จะผลักดันโปรแกรมเมอร์

ป้อน Python, Ruby และอื่น ๆ เหล่านี้เป็นภาษาวัตถุประสงค์ทั่วไปที่ดีมากจริงๆ พวกเขาสนับสนุนการประมวลผลข้อความและทำมันได้ดี (แม้ว่าอาจจะไม่ได้ผูกมัดอย่างแน่นหนาในหลักพื้นฐานของภาษา) แต่พวกเขาก็ขยายขนาดได้ดีมากและยังคงมีโค้ดที่ดูดีในตอนท้ายของวัน พวกเขายังได้พัฒนาชุมชนที่ค่อนข้างแข็งแรงพร้อมห้องสมุดมากมายสำหรับทุกสิ่ง

ตอนนี้การปฏิเสธต่อ Perl ส่วนใหญ่เป็นเรื่องของความเห็นและแน่นอนว่าบางคนสามารถเขียน Perl ที่สะอาดมาก แต่ด้วยคนจำนวนมากที่บ่นว่ามันง่ายเกินไปที่จะสร้างรหัสที่สับสนคุณรู้ว่าความจริงบางอย่างอยู่ที่นั่น คำถามจะกลายเป็นจริงคุณจะเคยใช้ภาษานี้มานานกว่าการเปลี่ยนสคริปต์ทุบตีง่าย ๆ ถ้าไม่เรียนรู้เพิ่มเติม Perl .. มันยอดเยี่ยมอย่างแน่นอนสำหรับที่ ในทางกลับกันถ้าคุณต้องการภาษาที่จะเติบโตไปพร้อมกับคุณตามที่คุณต้องการมากขึ้นฉันขอแนะนำ Python หรือ Ruby

โชคดี!


9

ผมขอแนะนำหนังสือออนไลน์ที่น่ากลัวดำน้ำลงในหลาม มันเป็นวิธีที่ฉันเรียนรู้ภาษาเดิม

นอกเหนือจากการสอนโครงสร้างพื้นฐานของภาษาและโครงสร้างข้อมูลที่มีประโยชน์มากมายมันมีบทที่ดีเกี่ยวกับการจัดการไฟล์และบทต่อ ๆ มาในการแสดงออกปกติและอื่น ๆ


1
... ปัญหาหลักของคำตอบสำหรับลิงค์เท่านั้น
Jean-François Fabre

7

การเพิ่มคำตอบก่อนหน้า: ตรวจสอบโมดูลpexpectสำหรับจัดการกับคำสั่งแบบโต้ตอบ (adduser, passwd เป็นต้น)


7

เหตุผลหนึ่งที่ฉันชอบ Python ก็คือมันเป็นมาตรฐานที่ดีกว่าเครื่องมือ POSIX ฉันต้องตรวจสอบสองครั้งและสามครั้งว่าแต่ละบิตเข้ากันได้กับระบบปฏิบัติการอื่น โปรแกรมที่เขียนบนระบบ Linux อาจไม่ทำงานเหมือนกันในระบบ BSD ของ OSX ด้วย Python ฉันแค่ต้องตรวจสอบว่าระบบเป้าหมายมี Python เวอร์ชันที่ทันสมัยเพียงพอแล้ว

ยิ่งไปกว่านั้นโปรแกรมที่เขียนใน Python มาตรฐานจะทำงานบน Windows!


1
"โปรแกรมที่เขียนด้วย Python มาตรฐานจะทำงานบน Windows": ไม่มีล้อเล่น?
Jean-François Fabre

6

ฉันจะให้ความเห็นที่นี่ตามประสบการณ์:

สำหรับเปลือก:

  • เชลล์สามารถวางไข่โค้ดอ่านอย่างเดียวได้ง่ายมาก เขียนมันและเมื่อคุณกลับมาที่คุณจะไม่คิดว่าสิ่งที่คุณทำอีกครั้ง มันง่ายมากที่จะทำสิ่งนี้ให้สำเร็จ
  • เชลล์สามารถทำการประมวลผลข้อความจำนวนมากแยก ฯลฯ ในหนึ่งบรรทัดด้วยไพพ์
  • มันเป็นภาษากาวที่ดีที่สุดเมื่อรวมการเรียกโปรแกรมในภาษาการเขียนโปรแกรมที่แตกต่างกัน

สำหรับงูหลาม:

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

ฉันมักจะเลือกทุบตีเพื่อสิ่งต่าง ๆ ส่วนใหญ่ แต่เมื่อฉันมีบางอย่างที่ต้องข้ามขอบเขตหน้าต่างฉันก็ใช้หลาม


4

pythonpyเป็นเครื่องมือที่ให้การเข้าถึงคุณลักษณะหลายอย่างจาก awk และ sed แต่ใช้ไวยากรณ์ของ python:

$ echo me2 | py -x 're.sub("me", "you", x)'
you2

3

ฉันได้สร้างเชลล์สคริปต์แบบกึ่งยาว (300-500 บรรทัด) และรหัส Python ซึ่งทำหน้าที่คล้ายกัน เมื่อคำสั่งภายนอกจำนวนมากถูกดำเนินการฉันพบว่า shell นั้นใช้งานง่ายกว่า Perl ยังเป็นตัวเลือกที่ดีเมื่อมีการจัดการข้อความจำนวนมาก


3

ในขณะที่ค้นคว้าหัวข้อนี้ฉันพบรหัสการพิสูจน์แนวคิดนี้ (ผ่านความคิดเห็นที่http://jlebar.com/2010/2/1/Replacing_Bash.html ) ที่ให้คุณ "เขียนท่อเหมือนเชลล์ใน Python โดยใช้ ไวยากรณ์ของคำศัพท์สั้น ๆ และใช้ประโยชน์จากเครื่องมือระบบที่มีอยู่แล้ว

for line in sh("cat /tmp/junk2") | cut(d=',',f=1) | 'sort' | uniq:
    sys.stdout.write(line)

2

ทางออกที่ดีที่สุดของคุณคือเครื่องมือที่มุ่งเน้นที่ปัญหาของคุณโดยเฉพาะ หากเป็นการประมวลผลไฟล์ข้อความ Sed, Awk และ Perl จะเป็นอันดับต้น ๆ Python เป็นภาษาไดนามิกที่ใช้งานทั่วไป เช่นเดียวกับภาษาวัตถุประสงค์ทั่วไปมีการรองรับการจัดการไฟล์ แต่นั่นไม่ใช่สิ่งที่เป็นวัตถุประสงค์หลัก ฉันจะพิจารณา Python หรือ Ruby ถ้าฉันมีข้อกำหนดสำหรับภาษาไดนามิกโดยเฉพาะ

ในระยะสั้นเรียนรู้ Sed และ Awk ได้ดีจริงๆรวมทั้งสินค้าอื่น ๆ ทั้งหมดที่มาพร้อมกับรสชาติของ * nix (Bash ในตัวทั้งหมด, grep, tr และอื่น ๆ ) หากเป็นการประมวลผลไฟล์ข้อความที่คุณสนใจแสดงว่าคุณใช้สิ่งที่ถูกต้องอยู่แล้ว


2

คุณสามารถใช้หลามแทนการทุบตีด้วยShellPyห้องสมุด

นี่คือตัวอย่างที่ดาวน์โหลดอวตารของผู้ใช้ Python จาก Github:

import json
import os
import tempfile

# get the api answer with curl
answer = `curl https://api.github.com/users/python
# syntactic sugar for checking returncode of executed process for zero
if answer:
    answer_json = json.loads(answer.stdout)
    avatar_url = answer_json['avatar_url']

    destination = os.path.join(tempfile.gettempdir(), 'python.png')

    # execute curl once again, this time to get the image
    result = `curl {avatar_url} > {destination}
    if result:
        # if there were no problems show the file
        p`ls -l {destination}
    else:
        print('Failed to download avatar')

    print('Avatar downloaded')
else:
    print('Failed to access github api')

อย่างที่คุณเห็นสัญลักษณ์ทั้งหมดที่อยู่ในสัญลักษณ์สำเนียงหลุมฝังศพ (`) ถูกเรียกใช้ในเชลล์ และในรหัสไพ ธ อนคุณสามารถบันทึกผลลัพธ์ของการดำเนินการนี้และดำเนินการกับมันได้ ตัวอย่างเช่น:

log = `git log --pretty=oneline --grep='Create'

บรรทัดนี้จะเรียกใช้งานgit log --pretty=oneline --grep='Create'ในเชลล์ก่อนจากนั้นจึงกำหนดผลลัพธ์ให้กับตัวแปรบันทึก ผลลัพธ์มีคุณสมบัติดังต่อไปนี้:

stdoutข้อความทั้งหมดจาก stdout ของกระบวนการดำเนินการ

stderrข้อความทั้งหมดจาก stderr ของกระบวนการที่ดำเนินการ

returncode returncode ของการดำเนินการ

นี่คือภาพรวมทั่วไปของห้องสมุดรายละเอียดเพิ่มเติมเกี่ยวกับตัวอย่างที่สามารถพบได้ที่นี่


1

หากการจัดการ textfile ของคุณเป็นแบบครั้งเดียวอาจทำได้บน shell-prompt คุณจะไม่ได้อะไรที่ดีกว่าจากไพ ธ อน

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

ตัวอย่างง่ายๆที่ให้ความรู้สึก

import popen2
stdout_text, stdin_text=popen2.popen2("your-shell-command-here")
for line in stdout_text:
  if line.startswith("#"):
    pass
  else
    jobID=int(line.split(",")[0].split()[1].lstrip("<").rstrip(">"))
    # do something with jobID

ตรวจสอบโมดูล sys และ getopt พวกเขาเป็นคนแรกที่คุณจะต้อง


1

ฉันได้เผยแพร่แพ็คเกจบน PyPI: ezแล้ว
ใช้pip install ezสำหรับติดตั้ง

มันบรรจุคำสั่งทั่วไปในเชลล์และ lib ของฉันใช้ไวยากรณ์เดียวกับเชลล์ เช่น cp (ต้นทางปลายทาง) สามารถจัดการได้ทั้งไฟล์และโฟลเดอร์! (wrapper ของ shutil.copy shutil.copytree และจะตัดสินใจว่าจะใช้เมื่อใด) ยิ่งไปกว่านั้นมันสามารถรองรับ vectorization เช่น R!

อีกตัวอย่าง: ไม่มี os.walk ใช้ fls (path, regex) เพื่อค้นหาไฟล์และตัวกรองซ้ำด้วยนิพจน์ทั่วไปและส่งคืนรายการไฟล์ที่มีหรือไม่มีพา ธ เต็ม

ตัวอย่างสุดท้าย: คุณสามารถรวมไว้เพื่อเขียนสคริปต์อย่างง่าย ๆ :
files = fls('.','py$'); cp(files, myDir)

ตรวจสอบอย่างแน่นอน! มีค่าใช้จ่ายฉันหลายร้อยชั่วโมงในการเขียน / ปรับปรุง!


1
ดูน่าสนใจ แต่ฉันไม่สามารถทำลายเอกสารที่ยังไม่ฟอร์แมตที่pypi.python.org/pypi/ezขอโทษ ...
เกร็ก Dubicki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.