2009-06-26 22 views
6

Cập nhật: Khi tôi sử dụng subprocess.call thay vì subprocess.Popen, vấn đề được giải quyết - không ai biết nguyên nhân là gì? Và có một vấn đề khác: Tôi dường như không thể tìm thấy một cách để kiểm soát đầu ra ... Có cách nào để chuyển hướng đầu ra từ subprocess.call đến một chuỗi hoặc một cái gì đó như thế? Cảm ơn!Khi tôi viết một kịch bản python để chạy Devenv với cấu hình "Debug | Win32" nó không có gì

Tôi đang cố gắng sử dụng Devenv để xây dựng các dự án, và nó chỉ chạy tốt khi tôi gõ vào dấu nhắc lệnh như devenv A.sln /build "Debug|Win32" - nhưng khi tôi sử dụng một con trăn để chạy nó bằng cách sử Popen(cmd,shell=true) nơi cmd là dòng tương tự như trên, nó cho thấy không có gì. Nếu tôi xóa |, hãy thay đổi thành chỉ "Debug", nó hoạt động ....

Có ai biết tại sao điều này xảy ra không? Tôi đã thử đặt một \ trước |, nhưng vẫn không có gì xảy ra ..

Đây là mã tôi đang sử dụng:

from subprocess import Popen, PIPE 

cmd = ' "C:\\Program Files\\Microsoft Visual Studio 8\\Common7\\IDE\\devenv" solution.sln /build "Debug|Win32" ' 

sys.stdout.flush() 
p = Popen(cmd,shell=True,stdout=PIPE,stderr=PIPE) 
lines = [] 
for line in p.stdout.readlines(): 
    lines.append(line) 
out = string.join(lines) 
print out 
if out.strip(): 
    print out.strip('\n') 
    sys.stdout.flush() 

... mà không làm việc, tuy nhiên, nếu tôi trao đổi Debug|Win32 với Debug, nó hoạt động một cách hoàn hảo ..

Cám ơn tất cả các bình luận ở đây

+0

Chỉ cần một linh cảm xuất hiện trong đầu tôi, bạn đã sử dụng popen nào/bạn có thể hiển thị câu lệnh nhập không? –

+0

Chắc chắn, đó là: từ subprocess nhập khẩu Popen, PIPE p = Popen (cmd, vỏ = True, stdout = PIPE, stderr = PIPE) nơi cmd là một cái gì đó như ' ".. (đường dẫn)/devenv" giải pháp/xây dựng "Debug | Win32" ... có vẻ như | dấu hiệu làm cho toàn bộ lệnh bị bỏ qua ... –

+0

Tôi phát hiện ra rằng tạo ra một tập tin compile.bat trên bay trong Python, trong đó có chứa toàn bộ 'devenv.com' lệnh, và sau đó chạy compile.bat từ Python bằng cách sử dụng' Popen' hoạt động như một say mê. –

Trả lời

0

Khi shell = False được sử dụng, nó sẽ xử lý chuỗi như một lệnh duy nhất, vì vậy bạn cần phải vượt qua lệnh/arugments như một danh sách .. Một cái gì đó như:

from subprocess import Popen, PIPE 

cmd = [ 
    r"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv", # in raw r"blah" string, you don't need to escape backslashes 
    "solution.sln", 
    "/build", 
    "Debug|Win32" 
] 

p = Popen(cmd, stdout=PIPE, stderr=PIPE) 
out = p.stdout.read() # reads full output into string, including line breaks 

print out 
+0

Thực ra danh sách các đối số không hiệu quả đối với tôi - khi tôi chạy nó, nó vẫn hiển thị hộp thoại trợ giúp của devenv, điều này chỉ có nghĩa là đối số đầu tiên được gọi. Tuy nhiên, bạn đã có ý nghĩa đúng với đối số shell - nó bật ra khi tôi vô hiệu hóa shell = True, dòng lệnh ban đầu hoạt động hoàn hảo. Phải có ý nghĩa khác nhau cho | với tùy chọn vỏ tôi đoán. Cảm ơn và cổ vũ! –

0

cố gắng gấp đôi trích dẫn như sau: 'devenv A.sln/build "Debug | Win32"'

+0

Tôi đã tăng gấp đôi trích dẫn thực sự .. –

0

Có vẻ như vỏ của Windows đang chụp | làm đường ống (bất kể dấu ngoặc kép và dấu thoát). Bạn đã thử sử dụng shell=False?

+0

Khi tôi đặt shell thành False, tôi dường như không thể nhận được bất kỳ đầu ra nào nên không thể đảm bảo rằng nó có hoạt động hay không. Bạn có thể cho tôi biết làm thế nào để có được đầu ra khi shell = False? Cảm ơn –

+0

Đó là một bí ẩn - hãy cho chúng tôi thấy toàn bộ đoạn mã, nếu không nó sẽ không nghi ngờ gì ở một ;-). –

+0

Nó bật ra nó là lựa chọn vỏ gây ra vấn đề. Không chắc chắn lý do tại sao tôi đã không thể có được đầu ra tại tho đầu tiên. Cảm ơn!! –

4

Có sự khác biệt giữa devenv.exedevenv.com, cả hai đều có thể thực thi và nằm trong cùng một thư mục (tiếng thở dài). Các dòng lệnh được sử dụng trong câu hỏi và một số câu trả lời không nói những gì họ muốn vì vậy tôi không chắc chắn sẽ được sử dụng.

Nếu bạn muốn gọi từ dòng lệnh, bạn cần đảm bảo bạn sử dụng devenv.com, nếu không bạn có khả năng nhận được GUI bật lên. Tôi nghĩ rằng đây có thể là nguyên nhân của một số (nhưng không phải tất cả) của sự nhầm lẫn.

+2

điều này làm việc cho tôi. Tôi đã thay đổi 'devenv' ở trên thành 'devenv.com' và tất cả bắt đầu hoạt động. – gman

1

Xem phần 17.1.5.1. trong tài liệu python.

Trên Windows, Python tự động thêm dấu ngoặc kép xung quanh đối số cấu hình dự án tức là Debug | win32 được chuyển thành "Debug | win32" thành devenv. Bạn KHÔNG cần phải thêm dấu ngoặc kép và bạn KHÔNG cần phải vượt qua shell = True to Popen.

Sử dụng ProcMon để xem chuỗi đối số được chuyển đến devenv.

Các vấn đề liên quan