2012-04-04 32 views
10

Tôi đang sử dụng Windows và Python (rất hiệu quả) ngăn không cho tôi gửi một ký tự độc lập '\n' tới STDOUT. Ví dụ: sản phẩm sau sẽ xuất ra foo\r\nvar:Làm cho Python ngừng phát ra một dấu xuống dòng khi viết dòng mới vào sys.stdout

sys.stdout.write("foo\nvar") 

Làm cách nào để tắt tính năng "này"? Viết vào một tập tin đầu tiên không phải là một lựa chọn, bởi vì đầu ra đang được đường ống.

+4

Bạn hiện đang sử dụng mã nào? – Amber

+0

Bất kể sys.stdout được mở bằng. –

+1

Tôi có nghĩa là bạn đang sử dụng những gì để viết cho nó? 'in'? 'sys.stdout.write()'? – Amber

Trả lời

11

Hãy thử những điều sau trước khi viết bất cứ điều gì:

import sys 

if sys.platform == "win32": 
    import os, msvcrt 
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) 

Nếu bạn chỉ muốn thay đổi sang chế độ nhị phân tạm thời, bạn có thể viết cho mình một wrapper:

import sys 
from contextlib import contextmanager 

@contextmanager 
def binary_mode(f): 
    if sys.platform != "win32": 
     yield; return 

    import msvcrt, os 
    def setmode(mode): 
     f.flush() 
     msvcrt.setmode(f.fileno(), mode) 

    setmode(os.O_BINARY) 
    try: 
     yield 
    finally: 
     setmode(os.O_TEXT) 

with binary_mode(sys.stdout), binary_mode(sys.stderr): 
    # code 
+0

Vâng, tôi cũng thấy điều đó. –

+0

@ John: 4 giây khác biệt: D Đoán cả hai chúng tôi đều sử dụng cùng một cụm từ tìm kiếm;) –

+0

"đây là kết quả của tìm kiếm Google rất nhanh", chỉ sau khi tôi đặt câu hỏi theo cách như vậy để làm cho việc tìm kiếm dễ dàng hơn. Tôi đã dành khoảng một giờ để tìm kiếm "làm cho việc ngừng vận chuyển em bé ngừng hoạt động python", và vì vậy tôi đã đến đây. –

-4

Add 'r' before the string:

sys.stdout.write(r"foo\nvar") 

Như mong đợi, nó cũng hoạt động để in.

+0

Ahm, nó sẽ in dấu gạch chéo ngược và n nghĩa đen? –

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