2008-12-03 33 views
5

Tôi có một số mã Python hoạt động chính xác khi tôi sử dụng python.exe để chạy nó, nhưng thất bại nếu tôi sử dụng pythonw.exe.Python subprocess.call() thất bại khi sử dụng pythonw.exe

 
    def runStuff(commandLine): 
     outputFileName = 'somefile.txt' 
     outputFile = open(outputFileName, "w") 

     try: 
      result = subprocess.call(commandLine, shell=True, stdout=outputFile) 
     except: 
      print 'Exception thrown:', str(sys.exc_info()[1]) 

    myThread = threading.Thread(None, target=runStuff, commandLine=['whatever...']) 
    myThread.start() 

Các thông điệp mà tôi nhận được là:

 
    Exception thrown: [Error 6] The handle is invalid 

Tuy nhiên, nếu tôi không chỉ định tham số 'stdout', subprocess.call() bắt đầu ổn.

Tôi có thể thấy rằng pythonw.exe có thể đang chuyển hướng đầu ra chính nó, nhưng tôi không thể thấy tại sao tôi bị chặn chỉ định stdout cho một chuỗi mới.

Trả lời

7

sys.stdinsys.stdout xử lý không hợp lệ vì pythonw không cung cấp hỗ trợ bảng điều khiển khi nó chạy dưới dạng deamon, do đó đối số mặc định của subprocess.call() không thành công.

Deamon chương trình đóng stdin/stdout/stderr purposedly và sử dụng đăng nhập thay vào đó, để bạn có để quản lý này cho mình: Tôi sẽ đề nghị sử dụng subprocess.PIPE.

Nếu bạn thực sự không quan tâm đến những gì quy trình phụ nói lỗi và tất cả, bạn có thể sử dụng os.devnull (Tôi không thực sự chắc chắn nó di động như thế nào?) Nhưng tôi sẽ không khuyên bạn nên.

6

Đối với hồ sơ, mã của tôi bây giờ trông như thế này:

def runStuff(commandLine): 
    outputFileName = 'somefile.txt' 
    outputFile = open(outputFileName, "w") 

    if guiMode: 
     result = subprocess.call(commandLine, shell=True, stdout=outputFile, stderr=subprocess.STDOUT) 
    else: 
     proc = subprocess.Popen(commandLine, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE) 
     proc.stdin.close() 
     proc.wait() 
     result = proc.returncode 
     outputFile.write(proc.stdout.read()) 

Lưu ý rằng, do một lỗi rõ ràng trong các mô-đun subprocess, cuộc gọi đến Popen() có chỉ định một ống cho stdin cũng , mà chúng tôi đóng ngay sau đó.

2

Đây là một câu hỏi cũ, nhưng cùng một vấn đề đã xảy ra với pyInstaller quá.

Trong sự thật, điều này sẽ xảy ra với bất kỳ khung nào chuyển đổi mã trong python cho exe mà không cần bàn điều khiển.

Trong các thử nghiệm của tôi, tôi quan sát thấy rằng nếu tôi sử dụng cờ "console = True" vào tệp spec của tôi (pyInstaller), lỗi này không còn xảy ra nữa. .

Giải pháp được thực hiện theo đầu của Piotr Lesnicki.

+0

Tôi hiện đang gặp sự cố tương tự, tôi đã tạo một ứng dụng lớn với PyQt4 và tôi không thể nhận selen để hoạt động mà không có bảng điều khiển. Vui lòng cho tôi biết cách khắc phục điều này. https://stackoverflow.com/questions/46520823/selenium-dont-work-after-exporting-to-exe-in-windowed-mode-in-pyinstaller –

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