วิธีใช้กระบวนการย่อย popen Python


102

เนื่องจาก os.popen ถูกแทนที่ด้วย subprocess.popen ฉันจึงสงสัยว่าจะแปลงได้อย่างไร

os.popen('swfdump /tmp/filename.swf/ -d')

ไปยัง subprocess.popen ()

ฉันเหนื่อย:

subprocess.Popen("swfdump /tmp/filename.swf -d")
subprocess.Popen("swfdump %s -d" % (filename))  # NOTE: filename is a variable
                                                # containing /tmp/filename.swf

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


1
นี่คือเครื่อง Windows หรือเครื่อง Linux?
AAI

คำตอบ:


141

subprocess.Popen รับรายการอาร์กิวเมนต์:

from subprocess import Popen, PIPE

process = Popen(['swfdump', '/tmp/filename.swf', '-d'], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()

มีแม้กระทั่งในส่วนของเอกสารทุ่มเทให้กับการช่วยให้ผู้ใช้โยกย้ายจากไปos.popensubprocess


18
@HansThen shell=Trueจะไม่แนะนำ
Pierre GM

7
@Lukas Graf เนื่องจากมีการระบุไว้ในรหัส @Alex shell = True ถือเป็นความเสี่ยงด้านความปลอดภัยเมื่อใช้ในการประมวลผลข้อมูลที่ไม่น่าเชื่อถือ ผู้โจมตีที่ชาญฉลาดสามารถปรับเปลี่ยนอินพุตเพื่อเข้าถึงคำสั่งของระบบโดยพลการ เช่นโดยการป้อนfilename.swf; rm -rf /ค่าของชื่อไฟล์ อย่างไรก็ตามนี่เป็นเพียงปัญหาเมื่อเนื้อหาในการโต้แย้งของคุณกับ Popen ไม่ปลอดภัย
Hans Then

10
@Lukas Graf จากส่วนของโค้ดฉันสงสัยอย่างยิ่งว่านั่นหมายถึงค่าตัวอย่างที่จะถูกเติมโดยข้อมูลที่ผู้ใช้ไม่น่าเชื่อถือให้มา แต่ฉันเตรียมที่จะเรียกร้องให้มีการพักรบในรายการนั้น ประเด็นของฉันมีมากกว่านั้นคือไม่มีเหตุผลที่จะไม่ใช้shell=Trueยกเว้นเมื่อใช้อินพุตที่ไม่น่าเชื่อถือ การระบุเพียงว่าshell=Trueไม่แนะนำนั้นทำให้เข้าใจผิด
Hans Then

7
@HansThen: ป.ล. อย่าเข้าใจฉันผิดฉันไม่ได้พยายามทำคดีของคุณที่นี่ ดูเหมือนว่าคุณจะตระหนักถึงความเสี่ยงที่เกี่ยวข้องshell=Trueแต่ผู้ใช้ที่สุ่มพบคำถามนี้อาจไม่เกิดขึ้น นั่นเป็นเหตุผลที่ฉันคิดว่าสิ่งสำคัญคือต้องเน้นว่าshell=Trueในความเป็นจริงไม่แนะนำเว้นแต่คุณจะรู้แน่ชัดว่าคุณกำลังทำอะไรอยู่
Lukas Graf

4
@Blender ไม่มีใครบอกว่ามันเป็นอันตราย - มันเป็นแค่อันตราย แต่นอกเหนือจากนั้นการโต้แย้งของคุณไม่สมเหตุสมผลเลย ฟังก์ชันระบบปฏิบัติการจำนวนมากที่ไลบรารีมาตรฐาน Python เปิดเผยอาจเป็นอันตรายได้shutil.rmtreeตัวอย่างเช่น แต่นั่นไม่เกี่ยวว่าจะรวมอยู่ใน stdlib หรือไม่ ฉันเชื่อว่าปรัชญาของ UNIX "Unix ไม่ได้ถูกออกแบบมาเพื่อหยุดยั้งผู้ใช้จากการทำสิ่งที่โง่เขลา ยังใช้กับ Python เป็นส่วนใหญ่
Lukas Graf

9

ใช้shมันจะทำให้ง่ายขึ้นมาก:

import sh
print sh.swfdump("/tmp/filename.swf", "-d")

2
มันก็ดี แต่มันก็ไม่เหมือนกันกับ Popen ของกระบวนการย่อย sh เหมือนกับการเรียกกระบวนการย่อย
liuyang1

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