2010-05-14 34 views
44

Tôi có một tập lệnh nơi tôi khởi chạy với lệnh popen shell. Vấn đề là tập lệnh không đợi cho đến khi lệnh popen đó kết thúc và tiếp tục ngay lập tức.Lệnh popen Python. Chờ cho đến khi lệnh được hoàn thành

om_points = os.popen(command, "w") 
..... 

Làm cách nào tôi có thể yêu cầu tập lệnh Python đợi cho đến khi lệnh shell kết thúc?

Trả lời

65

Tùy thuộc vào cách bạn muốn làm việc với tập lệnh của mình, bạn có hai tùy chọn. Nếu bạn muốn các lệnh chặn và không làm bất cứ điều gì trong khi nó đang thực hiện, bạn chỉ có thể sử dụng subprocess.call.

#start and block until done 
subprocess.call([data["om_points"], ">", diz['d']+"/points.xml"]) 

Nếu bạn muốn làm những việc trong khi nó đang thực hiện hoặc những thứ thức ăn vào stdin, bạn có thể sử dụng communicate sau popen gọi.

#start and process things, then wait 
p = subprocess.Popen([data["om_points"], ">", diz['d']+"/points.xml"]) 
print "Happens while running" 
p.communicate() #now wait plus that you can send commands to process 

Như đã nêu trong tài liệu, wait có thể bế tắc, vì vậy hãy liên lạc.

+0

Kiểm tra tài liệu trên [subprocess.call] (http://docs.python.org/library/subprocess.html#convenience-functions) – thornomad

5

Điều bạn đang tìm kiếm là phương pháp wait.

+0

Nhưng nếu tôi gõ:. om_points = os.popen (dữ liệu [ "om_points"] + "> "+ diz [ 'd'] +"/ points.xml", "w") chờ đợi () Tôi nhận được lỗi này: Traceback (cuộc gọi gần đây nhất): Tệp "./model_job.py", dòng 77, trong om_points = os.popen (dữ liệu ["om_points"] + ">" + diz ['d'] + "/ points.xml", "w"). wait() AttributeError: đối tượng 'file' không có thuộc tính 'wait' Vấn đề là gì? Cảm ơn bạn lần nữa. – michele

+9

Bạn đã không nhấp vào liên kết mà tôi đã cung cấp. 'wait' là một phương thức của lớp' subprocess'. –

+0

chờ đợi có thể bế tắc nếu quá trình ghi thành stdout và không ai đọc nó – ansgri

5

Bạn có thể sử dụng subprocess để đạt được điều này.

import subprocess 

#This command could have multiple commands separated by a new line \n 
some_command = "export PATH=$PATH://server.sample.mo/app/bin \n customupload abc.txt" 

p = subprocess.Popen(some_command, stdout=subprocess.PIPE, shell=True) 

(output, err) = p.communicate() 

#This makes the wait possible 
p_status = p.wait() 

#This will give you the output of the command being executed 
print "Command output: " + output 
Các vấn đề liên quan