2012-04-24 19 views
11

Tôi muốn có thể để có được nội dung của stdout và stderr khi tôi chạy kịch bản sau đây trên cửa sổ sử dụng pythonw.exe:trình con Popen không làm việc với pythonw.exe

import subprocess 
import sys 
import os 
import string 
import time 

tmpdir = 'c:/temp' 
cmd = 'dir c:' 

tmpfile = "tmp_%f" % (time.time()) 
tmpfile = os.path.normpath(os.path.join(tmpdir,tmpfile)) 
tmpfile2 = tmpfile+".bat" 
tmpfile3 = tmpfile+".txt" 

fa = open(tmpfile2,'w') 
fa.write("@ECHO OFF > NUL\n") 
fa.write('call '+cmd+"\n") 
fa.close() 

wcmd = [] 
wcmd.append(tmpfile2) 

startupinfo = subprocess.STARTUPINFO() 
startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW 

fb = open(tmpfile3,'w') 
fb.write("\n") 
fb.write(tmpfile2+"\n") 

try: 
    procval = subprocess.Popen(wcmd, startupinfo=startupinfo, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate() 
    fb.write(str(procval)+"\n") 
    fb.write("Sucess") 
    fb.close() 
except: 
    fb.write(str(procval)+"\n") 
    fb.write("Failure") 
    fb.close() 

Khi tôi thực hiện nó bằng cách sử python .exe Tôi nhận được kết quả mong đợi. Khi tôi chạy nó bằng pythonw.exe Tôi kết thúc ở bên ngoại lệ. Nếu tôi chạy popen chỉ với lệnh và startupinfo cờ lệnh sẽ hoàn thành thành công nhưng không có quyền truy cập vào dữ liệu trong tiến trình con. Tất cả mọi thứ mà tôi đọc nói rằng điều này sẽ làm việc nhưng phải thiếu một cái gì đó. Mọi sự trợ giúp sẽ rất được trân trọng.

Cảm ơn, Randy

+0

Bạn có gặp phải thông tin ngoại lệ không? – jdi

+0

Tôi đã thử nhưng không thành công. Điều này là dễ dàng enought để nhân rộng vì vậy bất kỳ ý tưởng về làm thế nào để có được thông tin ngoại lệ và sẽ cung cấp cho nó một shot – user1352650

+0

Tôi không hiểu. Bạn có mã truy cập một khối chung trừ khối nhưng bạn không thể cho chúng ta thấy ngoại lệ đó? Thay đổi nó thành: "ngoại trừ ngoại lệ, e" và đăng nhập e. Hoặc chỉ cần tăng ở cuối để bạn có thể thấy lỗi là gì – jdi

Trả lời

10

Đây có thể là một lỗi khi sử dụng pythonw.exe

pythonw.exe bắt đầu một quá trình daemon mà không có quyền truy cập thông thường đối với file descriptor chuẩn. Điều duy nhất bạn cần thực hiện trong tập lệnh là đặt cụ thể fd thứ 3 cho stdin:

p = subprocess.Popen(wcmd, 
        startupinfo=startupinfo, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.STDOUT, 
        stdin=subprocess.PIPE) 
procval = p.communicate() 
+0

Liên kết đưa ra 404: ( – msiemens

4

(Một vài năm sau câu trả lời này ...) Tôi đã gặp phải vấn đề tương tự và tìm thấy mà bạn nên thay thế này:

stdout = subprocess.PIPE

với điều này:

stdin = sub process.PIPE

Đây là dự đoán của tôi về vấn đề cơ bản: pythonw khởi chạy quá trình không có stdin (có nghĩa là vì không có bảng điều khiển). Quá trình con cố gắng truy cập stdin và điều này gây ra lỗi.

Cách khác là sử dụng/dev/null cho stdin, xem chuỗi này để thảo luận về cách thực hiện: Ignoring output from subprocess.Popen (ngoại trừ bạn sẽ muốn sử dụng devnull trên stdin).

+0

bạn có thể trễ vài năm với câu trả lời nhưng vẫn giúp tôi :) –

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