คำถามติดแท็ก subprocess

โมดูลกระบวนการย่อยของ Python ช่วยให้คุณสร้างกระบวนการใหม่เชื่อมต่อกับท่ออินพุต / เอาต์พุต / ข้อผิดพลาดและรับโค้ดส่งคืน ใช้เพื่อรันคำสั่งเชลล์หรือปฏิบัติการใน Python

15
เอาต์พุตสดจากคำสั่ง subprocess
ฉันใช้สคริปต์หลามเป็นไดรเวอร์สำหรับรหัสไฮโดรไดนามิกส์ เมื่อถึงเวลาที่จะทำการจำลองผมใช้subprocess.Popenเพื่อเรียกใช้รหัสรวบรวมผลลัพธ์จาก stdout และ stderr ลงในsubprocess.PIPE--- จากนั้นฉันสามารถพิมพ์ (และบันทึกลงในแฟ้มบันทึก) ข้อมูลผลลัพธ์และตรวจสอบข้อผิดพลาดใด ๆ . ปัญหาคือฉันไม่รู้ว่าโค้ดกำลังดำเนินไปอย่างไร ถ้าฉันเรียกใช้โดยตรงจากบรรทัดคำสั่งมันให้ผลลัพธ์เกี่ยวกับการวนซ้ำของมันที่เวลากี่โมงครั้งต่อไปคืออะไรเป็นต้น มีวิธีที่จะเก็บเอาท์พุททั้งสอง (สำหรับการบันทึกและการตรวจสอบข้อผิดพลาด) และยังผลิตถ่ายทอดสดสตรีมมิ่ง? ส่วนที่เกี่ยวข้องของรหัสของฉัน: ret_val = subprocess.Popen( run_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True ) output, errors = ret_val.communicate() log_file.write(output) print output if( ret_val.returncode ): print "RUN failed\n\n%s\n\n" % (errors) success = False if( errors ): log_file.write("\n\n%s\n\n" % errors) เดิมทีฉันกำลังทำการส่งrun_commandผ่านteeเพื่อให้สำเนาไปที่ไฟล์บันทึกโดยตรงและกระแสข้อมูลยังคงส่งออกไปยังเทอร์มินัลโดยตรง …

2
ความแตกต่างระหว่างโพรเซสย่อย Popen และการโทร (ฉันจะใช้ได้อย่างไร)
ฉันต้องการเรียกโปรแกรมภายนอกจาก Python ฉันใช้ทั้งสองPopen()และcall()ทำสิ่งนั้น ความแตกต่างระหว่างสองคืออะไร เป้าหมายเฉพาะของฉันคือการเรียกใช้คำสั่งต่อไปนี้จาก Python ฉันไม่แน่ใจว่าการเปลี่ยนเส้นทางทำงานอย่างไร ./my_script.sh > output ฉันอ่านเอกสารและมันบอกว่าcall()เป็นฟังก์ชั่นอำนวยความสะดวกหรือฟังก์ชั่นทางลัด เราสูญเสียพลังงานโดยการใช้call()แทนPopen()หรือไม่?
178 python  subprocess  popen 

3
OSError: [Errno 2] ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าวขณะใช้กระบวนการย่อย python ใน Django
ฉันพยายามเรียกใช้โปรแกรมเพื่อทำการเรียกระบบบางอย่างภายในรหัส Python โดยใช้subprocess.call()ซึ่งทำให้เกิดข้อผิดพลาดต่อไปนี้: Traceback (most recent call last): File "<console>", line 1, in <module> File "/usr/lib/python2.7/subprocess.py", line 493, in call return Popen(*popenargs, **kwargs).wait() File "/usr/lib/python2.7/subprocess.py", line 679, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory รหัส Python จริงของฉันมีดังนี้: …

18
รับเอาต์พุตแบบเรียลไทม์โดยใช้กระบวนการย่อย
ฉันกำลังพยายามเขียนสคริปต์ wrapper สำหรับโปรแกรมบรรทัดคำสั่ง (ตรวจสอบ svnadmin) ซึ่งจะแสดงตัวบ่งชี้ความคืบหน้าที่ดีสำหรับการดำเนินการ สิ่งนี้ต้องการให้ฉันสามารถเห็นแต่ละบรรทัดของเอาต์พุตจากโปรแกรมที่รวมไว้ได้ทันทีที่เอาต์พุต ฉันคิดว่าฉันจะดำเนินการโปรแกรมโดยsubprocess.Popenใช้ใช้stdout=PIPEแล้วอ่านแต่ละบรรทัดเมื่อเข้ามาและดำเนินการตามนั้น อย่างไรก็ตามเมื่อฉันรันโค้ดต่อไปนี้ผลลัพธ์ดูเหมือนจะถูกบัฟเฟอร์ที่ใดที่หนึ่งทำให้ปรากฏเป็นสองส่วนบรรทัดที่ 1 ถึง 332 จากนั้น 333 ถึง 439 (บรรทัดสุดท้ายของเอาต์พุต) from subprocess import Popen, PIPE, STDOUT p = Popen('svnadmin verify /var/svn/repos/config', stdout = PIPE, stderr = STDOUT, shell = True) for line in p.stdout: print line.replace('\n', '') หลังจากดูเอกสารเกี่ยวกับกระบวนการย่อยเล็กน้อยฉันค้นพบbufsizeพารามิเตอร์เป็นPopenดังนั้นฉันจึงลองตั้งค่า bufsize เป็น 1 (บัฟเฟอร์แต่ละบรรทัด) และ …
138 python  subprocess 

10
ฉันจะรันคำสั่งภายนอกแบบอะซิงโครนัสจาก Python ได้อย่างไร
ฉันต้องการเรียกใช้คำสั่งเชลล์แบบอะซิงโครนัสจากสคริปต์ Python ด้วยเหตุนี้ฉันหมายความว่าฉันต้องการให้สคริปต์ Python ของฉันทำงานต่อไปในขณะที่คำสั่งภายนอกดับลงและทำทุกอย่างที่ต้องทำ ฉันอ่านโพสต์นี้: เรียกคำสั่งภายนอกใน Python จากนั้นฉันก็ออกไปและทำการทดสอบและดูเหมือนว่าos.system()จะทำงานได้หากฉันใช้&ในตอนท้ายของคำสั่งเพื่อที่ฉันจะได้ไม่ต้องรอให้มันกลับมา สิ่งที่ฉันสงสัยคือว่านี่เป็นวิธีที่เหมาะสมในการทำสิ่งนั้นให้สำเร็จหรือไม่? ฉันลองแล้วcommands.call()แต่มันไม่ได้ผลสำหรับฉันเพราะมันบล็อกคำสั่งภายนอก โปรดแจ้งให้เราทราบหากos.system()แนะนำให้ใช้เส้นทางนี้หรือควรลองเส้นทางอื่น


3
วิธีใช้กระบวนการย่อย popen Python
เนื่องจาก 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 แต่ฉันเดาว่าฉันเขียนสิ่งนี้ไม่ถูกต้อง ความช่วยเหลือใด ๆ จะได้รับการชื่นชม ขอบคุณ
102 python  subprocess  popen 

8
กระบวนการย่อยเปลี่ยนไดเร็กทอรี
ฉันต้องการเรียกใช้สคริปต์ภายในไดเร็กทอรีย่อย / superdirectory (ฉันต้องอยู่ใน sub / super-directory ก่อน) ฉันไม่สามารถsubprocessเข้าสู่ไดเรกทอรีย่อยของฉัน: tducin@localhost:~/Projekty/tests/ve$ python Python 2.7.4 (default, Sep 26 2013, 03:20:26) [GCC 4.7.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import subprocess >>> import os >>> os.getcwd() '/home/tducin/Projekty/tests/ve' >>> subprocess.call(['cd ..']) Traceback (most recent call last): File "<stdin>", …

5
วิธีเปลี่ยนทิศทางเอาต์พุตด้วยกระบวนการย่อยใน Python
สิ่งที่ฉันทำในบรรทัดคำสั่ง: cat file1 file2 file3 > myfile สิ่งที่ฉันต้องการทำกับ python: import subprocess, shlex my_cmd = 'cat file1 file2 file3 > myfile' args = shlex.split(my_cmd) subprocess.call(args) # spits the output in the window i call my python program

3
ฉันจะไพพ์การเรียกกระบวนการย่อยไปยังไฟล์ข้อความได้อย่างไร
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"]) ตอนนี้ฉันมีสคริปต์ที่ฉันเรียกใช้ เมื่อฉันเรียกใช้และมันมาถึงบรรทัดนี้มันจะเริ่มพิมพ์สิ่งต่างๆเพราะ run.sh มีการพิมพ์อยู่ในนั้น ฉันจะไพพ์สิ่งนี้ไปยังไฟล์ข้อความได้อย่างไร (และพิมพ์ด้วยถ้าเป็นไปได้)

4
เหตุใด Popen.communicate () จึงส่งคืน b'hi \ n 'แทน' hi '
มีใครช่วยอธิบายได้ไหมว่าทำไมผลลัพธ์ที่ฉันต้องการคือ "hi" จึงมีตัวอักษร "b" และตามด้วยขึ้นบรรทัดใหม่ ฉันใช้Python 3.3 >>> import subprocess >>> print(subprocess.Popen("echo hi", shell=True, stdout=subprocess.PIPE).communicate()[0]) b'hi\n' 'b' พิเศษนี้จะไม่ปรากฏหากฉันรันด้วย python 2.7

13
จับ stdout แบบเรียลไทม์จากกระบวนการย่อย
ฉันต้องการsubprocess.Popen()rsync.exe ใน Windows และพิมพ์ stdout ใน Python รหัสของฉันใช้งานได้ แต่ไม่สามารถตรวจจับความคืบหน้าได้จนกว่าการถ่ายโอนไฟล์จะเสร็จสิ้น! ฉันต้องการพิมพ์ความคืบหน้าสำหรับแต่ละไฟล์แบบเรียลไทม์ ตอนนี้ใช้ Python 3.1 เนื่องจากฉันได้ยินมาว่าควรจัดการ IO ได้ดีกว่า import subprocess, time, os, sys cmd = "rsync.exe -vaz -P source/ dest/" p, line = True, 'start' p = subprocess.Popen(cmd, shell=True, bufsize=64, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE) for line in p.stdout: print(">>> " + str(line.rstrip())) p.stdout.flush()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.