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

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


16
การรันคำสั่งเชลล์และการดักจับเอาต์พุต
ฉันต้องการเขียนฟังก์ชั่นที่จะรันคำสั่งเชลล์และส่งคืนเอาต์พุตเป็นสตริงไม่ว่าจะเป็นข้อผิดพลาดหรือข้อความแจ้งความสำเร็จ ฉันแค่อยากได้ผลลัพธ์แบบเดียวกับที่ฉันได้รับจากบรรทัดคำสั่ง อะไรคือตัวอย่างโค้ดที่จะทำสิ่งนั้น? ตัวอย่างเช่น: def run_command(cmd): # ?????? print run_command('mysqladmin create test -uroot -pmysqladmin12') # Should output something like: # mysqladmin: CREATE DATABASE failed; error: 'Can't create database 'test'; database exists'
907 python  shell  subprocess 

30
การไม่บล็อกการอ่านบน subprocess.PIPE ใน python
ฉันใช้โมดูลย่อยเพื่อเริ่มกระบวนการย่อยและเชื่อมต่อกับเอาต์พุตสตรีม (stdout) ฉันต้องการที่จะรันการอ่านที่ไม่บล็อกบน stdout มีวิธีที่จะทำให้. non-block หรือตรวจสอบว่ามีข้อมูลในสตรีมก่อนที่ฉันจะเรียกใช้.readlineหรือไม่ ฉันต้องการให้อุปกรณ์พกพาหรืออย่างน้อยต้องทำงานภายใต้ Windows และ Linux นี่คือวิธีที่ฉันทำตอนนี้ (มันปิดกั้น.readlineหากไม่มีข้อมูล): p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE) output_str = p.stdout.readline()

29
การใช้โมดูล 'กระบวนการย่อย' กับการหมดเวลา
Наэтотвопросестьответына Stack Overflow нарусском : ผู้สร้าง: นี่คือรหัสไพ ธ อนเพื่อเรียกใช้คำสั่งโดยพลการส่งคืนstdoutข้อมูลหรือเพิ่มข้อยกเว้นรหัสการออกที่ไม่เป็นศูนย์: proc = subprocess.Popen( cmd, stderr=subprocess.STDOUT, # Merge stdout and stderr stdout=subprocess.PIPE, shell=True) communicate ถูกใช้เพื่อรอให้กระบวนการออกจาก: stdoutdata, stderrdata = proc.communicate() subprocessโมดูลไม่สนับสนุนการหมดเวลา - ความสามารถในการฆ่ากระบวนการทำงานมานานกว่าจำนวน X วินาที - จึงcommunicateอาจใช้เวลาตลอดไปวิ่ง เป็นอะไรที่ง่ายวิธีที่จะใช้หมดเวลาในโปรแกรมหลามหมายถึงการทำงานบน Windows และ Linux?

11
วิธียุติกระบวนการย่อยของ python ที่เปิดตัวด้วย shell = True
ฉันเปิดตัว subprocess ด้วยคำสั่งต่อไปนี้: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) อย่างไรก็ตามเมื่อฉันพยายามฆ่าโดยใช้: p.terminate() หรือ p.kill() คำสั่งยังคงทำงานในพื้นหลังดังนั้นฉันสงสัยว่าฉันจะยุติกระบวนการได้อย่างไร โปรดทราบว่าเมื่อฉันเรียกใช้คำสั่งด้วย: p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) p.terminate()มันไม่ยุติเรียบร้อยแล้วเมื่อออก

15
เก็บเอาต์พุตของ subprocess.Popen เปิดในสตริง
ฉันพยายามโทรออกด้วยระบบใน Python และเก็บเอาท์พุทเป็นสตริงที่ฉันสามารถจัดการได้ในโปรแกรม Python #!/usr/bin/python import subprocess p2 = subprocess.Popen("ntpq -p") ฉันลองทำบางสิ่งรวมถึงคำแนะนำที่นี่: การดึงผลลัพธ์ของ subprocess.call () แต่ไม่มีโชค
300 python  subprocess 

8
Python subprocess / Popen พร้อมสภาพแวดล้อมที่ถูกดัดแปลง
ฉันเชื่อว่าการรันคำสั่งภายนอกที่มีสภาพแวดล้อมที่ปรับเปลี่ยนเล็กน้อยเป็นกรณีทั่วไป นั่นเป็นวิธีที่ฉันมักจะทำ: import subprocess, os my_env = os.environ my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"] subprocess.Popen(my_command, env=my_env) ฉันมีความรู้สึกว่ามีวิธีที่ดีกว่า; มันดูไม่เป็นไร
285 python  subprocess  popen 

5
วิธีซ่อนเอาต์พุตของกระบวนการย่อยใน Python 2.7
ฉันใช้ eSpeak บน Ubuntu และมีสคริปต์ Python 2.7 ที่พิมพ์และพูดข้อความ: import subprocess text = 'Hello World.' print text subprocess.call(['espeak', text]) eSpeak สร้างเสียงที่ต้องการ แต่ตัดเชลล์ด้วยข้อผิดพลาดบางอย่าง (ALSA lib ... ไม่มีการเชื่อมต่อซ็อกเก็ต) ดังนั้นฉันไม่สามารถอ่านสิ่งที่พิมพ์ก่อนหน้านี้ได้อย่างง่ายดาย รหัสออกคือ 0 น่าเสียดายที่ไม่มีตัวเลือกเอกสารที่จะปิดการใช้คำฟุ่มเฟื่อยของมันดังนั้นฉันกำลังมองหาวิธีที่จะเงียบมันมองเห็นและทำให้เปลือกเปิดที่สะอาดสำหรับการโต้ตอบต่อไป ฉันจะทำสิ่งนี้ได้อย่างไร

11
ฉันจะส่งผ่านสตริงไปยัง subprocess.Popen (โดยใช้อาร์กิวเมนต์ stdin) ได้อย่างไร
ถ้าฉันทำต่อไปนี้: import subprocess from cStringIO import StringIO subprocess.Popen(['grep','f'],stdout=subprocess.PIPE,stdin=StringIO('one\ntwo\nthree\nfour\nfive\nsix\n')).communicate()[0] ฉันเข้าใจ: Traceback (most recent call last): File "<stdin>", line 1, in ? File "/build/toolchain/mac32/python-2.4.3/lib/python2.4/subprocess.py", line 533, in __init__ (p2cread, p2cwrite, File "/build/toolchain/mac32/python-2.4.3/lib/python2.4/subprocess.py", line 830, in _get_handles p2cread = stdin.fileno() AttributeError: 'cStringIO.StringI' object has no attribute 'fileno' เห็นได้ชัดว่าวัตถุ cStringIO.StringIO นั้นไม่ได้อยู่ใกล้กับเป็ดพอที่จะให้เหมาะสมกับ subprocess.Popen ฉันจะแก้ไขสิ่งนี้ได้อย่างไร
280 python  subprocess  stdin 

5
ความหมายที่แท้จริงของ 'shell = True' ในกระบวนการย่อย
ฉันกำลังเรียกกระบวนการที่แตกต่างกับsubprocessโมดูล อย่างไรก็ตามฉันมีคำถาม ในรหัสต่อไปนี้: callProcess = subprocess.Popen(['ls', '-l'], shell=True) และ callProcess = subprocess.Popen(['ls', '-l']) # without shell ทั้งงาน หลังจากอ่านเอกสารฉันก็รู้ว่าshell=Trueหมายถึงการรันโค้ดผ่านเชลล์ ดังนั้นนั่นหมายความว่ากระบวนการจะเริ่มต้นโดยตรง ดังนั้นสิ่งที่ฉันควรจะชอบสำหรับกรณีของฉัน - ฉันต้องเรียกใช้กระบวนการและรับเอาท์พุท ฉันจะได้ประโยชน์อะไรจากการเรียกมันจากภายในเปลือกหรือนอกมัน
260 python  subprocess 


9
อ่านกระบวนการ stdout ย่อยโดยบรรทัด
สคริปต์ python ของฉันใช้กระบวนการย่อยเพื่อเรียกใช้ยูทิลิตี linux ที่มีเสียงดังมาก ฉันต้องการเก็บผลลัพธ์ทั้งหมดไปยังล็อกไฟล์และแสดงบางส่วนแก่ผู้ใช้ ฉันคิดว่าสิ่งต่อไปนี้ใช้งานได้ แต่เอาต์พุตไม่ปรากฏขึ้นในแอปพลิเคชันของฉันจนกว่ายูทิลิตี้จะสร้างเอาต์พุตจำนวนมาก #fake_utility.py, just generates lots of output over time import time i = 0 while True: print hex(i)*512 i += 1 time.sleep(0.5) #filters output import subprocess proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE) for line in proc.stdout: #the real code does filtering here print "test:", line.rstrip() พฤติกรรมที่ฉันต้องการจริงๆคือสคริปต์ตัวกรองเพื่อพิมพ์แต่ละบรรทัดตามที่ได้รับจากกระบวนการย่อย …
235 python  subprocess 

13
พิมพ์เอาต์พุตกระบวนการย่อยอย่างต่อเนื่องขณะที่กระบวนการกำลังทำงาน
ในการเปิดโปรแกรมจากสคริปต์ Python ของฉันฉันใช้วิธีการต่อไปนี้: def execute(command): process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output = process.communicate()[0] exitCode = process.returncode if (exitCode == 0): return output else: raise ProcessException(command, exitCode, output) ดังนั้นเมื่อฉันเริ่มกระบวนการเช่นProcess.execute("mvn clean install")นี้โปรแกรมของฉันจะรอจนกระทั่งกระบวนการเสร็จสิ้นและหลังจากนั้นฉันก็จะได้ผลลัพธ์ที่สมบูรณ์ของโปรแกรมของฉัน สิ่งนี้น่ารำคาญถ้าฉันใช้กระบวนการที่ใช้เวลาสักครู่จึงจะเสร็จสิ้น ฉันสามารถให้โปรแกรมของฉันเขียนบรรทัดผลลัพธ์ของกระบวนการทีละบรรทัดโดยโพลผลลัพธ์ของกระบวนการก่อนที่มันจะเสร็จสิ้นในลูปหรือบางอย่าง ** [แก้ไข] ขออภัยฉันค้นหาไม่ค่อยดีก่อนโพสต์คำถามนี้ การทำเกลียวเป็นกุญแจสำคัญ พบตัวอย่างที่นี่ซึ่งแสดงวิธีการทำ: ** Python Subprocess.Popen จากเธรด
204 python  subprocess 

1
ฉันจะระบุไดเรกทอรีทำงานสำหรับป๊อป
มีวิธีการระบุไดเรกทอรีทำงานของคำสั่งใน Python subprocess.Popen()หรือไม่? ตัวอย่างเช่น: Popen('c:\mytool\tool.exe', workingdir='d:\test\local') สคริปต์ Python ของฉันอยู่ใน C:\programs\python เป็นไปได้ที่จะทำงานC:\mytool\tool.exeในไดเรกทอรีD:\test\localหรือไม่ ฉันจะตั้งค่าไดเรกทอรีการทำงานสำหรับกระบวนการย่อยได้อย่างไร
187 python  subprocess  popen 

5
วิธีรับรหัสออกเมื่อใช้วิธีการสื่อสารการประมวลผลย่อย Python
ฉันจะเรียกรหัสทางออกเมื่อใช้subprocessโมดูลPython และcommunicate()วิธีการได้อย่างไร รหัสที่เกี่ยวข้อง: import subprocess as sp data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0] ฉันควรจะทำเช่นนี้อีกทาง?
186 python  subprocess 

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