2010-07-14 34 views
58

Tôi đã sử dụng Cygwin trên Windows gần đây. Tôi muốn sử dụng cài đặt Windows của Python, vì vậy trong quá trình thử nghiệm, tôi đang sử dụng /cygdrive/c/Python26/python.exe myfile.py thay vì python myfile.exe.Sử dụng Windows Python từ Cygwin

Điều này hoạt động gần như hoàn hảo, ngoại trừ việc in. Khi tôi chạy Windows Python từ Cygwin đầu ra không in cho đến khi thực thi kết thúc. Nó hoạt động tốt trong Windows Python từ explorer.exe hoặc cmd.exe, và nó hoạt động trong Cygwin sử dụng Python được cài đặt Cygwin (/bin/python.exe).

Có cách giải quyết nào cho vấn đề này không? Điều quan trọng là có thể chạy phiên bản Windows, nhưng tôi muốn làm tất cả với Bash.

+1

bạn đã thử khởi chạy bash.exe từ dấu nhắc DOS chưa? Tôi nghĩ rằng điều này sẽ giải quyết vấn đề của bạn mà không cần phải sử dụng tùy chọn -i hoặc biến PYTHONUNBUFFERED. Hãy cho tôi biết nếu nó hoạt động cho bạn. – fixxxer

+0

Liên quan: https://stackoverflow.com/questions/13588454/invoking-python-under-cygwin-on-windows-hangs – Gwen

Trả lời

21

Có lẽ nếu bạn tuôn ra đầu ra

import sys 

V = range(100000) 
for x in V: 
    print x 
    sys.stdout.flush() 
+1

Vâng, whaddya biết - nó hoạt động, cảm ơn! – Skilldrick

107

Vấn đề thực sự là khi bạn chạy một lệnh trong bất kỳ chương trình terminal Cygwin như mintty, họ không hành động như Windows Consoles. Chỉ những cái dựa trên Windows Console như CMD hoặc Console2 mới làm điều đó. Vì vậy, với thiết bị đầu cuối Cygwin Windows python.exe không nghĩ rằng nó đang nói chuyện với một giao diện điều khiển tương tác.

Điều đó dẫn đến đầu ra đệm thay vì bộ đệm xả trên mỗi dòng như được thực hiện trong các phiên tương tác. Đó là lý do tại sao Amro thêm flush() trên mỗi dòng sửa chữa các triệu chứng, nhưng có nghĩa là thay đổi mã.

Một giải pháp mà không thay đổi mã là tắt bộ đệm bằng Python sử dụng cờ '-u' trên dòng lệnh hoặc đặt biến môi trường PYTHONUNBUFFERED.

export PYTHONUNBUFFERED=1 

/cydrive/c/Python27/python.exe foo.py 

hoặc

/cydrive/c/Python27/python.exe -u foo.py 

hoặc chạy trong chế độ tương tác

/cydrive/c/Python27/python.exe -i foo.py 

Bạn cũng sẽ không thể chạy chế độ tương tác python.exe Windows trong nhà ga Cygwin. Nó sẽ không mang đến một phiên tương tác, nhưng sẽ chỉ treo. Tôi tìm ra giải pháp tốt nhất có vẻ là để sử dụng 'cygstart' (tốt hơn so với việc sử dụng '-i' tùy chọn):

cygstart /cygdrive/c/Python27/python.exe 

Và điều đó dường như làm việc với ipython cũng (nếu được cài đặt):

cygstart /cygdrive/c/Python27/Scripts/ipython.exe 
+0

Câu trả lời hay. Nhân tiện, tôi không có một 'Python27/Scripts/ipython.exe' trong cài đặt của tôi ... – wap26

+1

Nó không đi kèm với Python trừ khi bạn cài đặt một cái gì đó giống như Phân phối Python Enthought. Bạn có thể cài đặt nó cho Windows bằng cách sử dụng easy_install hoặc tải xuống từ đây: http://pypi.python.org/pypi/ipython – noisygecko

+1

Điều này rất hữu ích. Một lưu ý: nếu tôi nhấn Ctrl + C để giết chương trình, trong mintty tôi vẫn không nhìn thấy dấu vết. Với cygstart, Ctrl + C dường như không hoạt động. Tôi thay vì sử dụng một vỏ bash Cygwin chạy từ cửa sổ thiết bị đầu cuối (mặc dù điều này không thể giải thích một số mã kiểm soát đúng). –

34

Không trả lời câu hỏi ban đầu, nhưng đối với những người muốn sử dụng Phiên tương tác Python từ trong thiết bị đầu cuối Cygwin (ví dụ: trong mintty) - hãy khởi động Python bằng tùy chọn "-i" để nói rõ ràng rằng nó cần chạy chế độ tương tác:

$ python -i 

Cách gọn gàng cũng là để tạo ra một bí danh trong .bashrc của bạn (khi biết rằng nó chỉ được đọc cho các phiên Terminal tương tác anyway):

alias python='python -i' 

Nếu không, Python sẽ không biết rằng nó chạy trong giao diện điều khiển , bởi vì tất cả các thiết bị đầu cuối dựa trên Cygwin pty (mintty, rxvt và xterm) đều được Windows công nhận là đường ống chứ không phải là giao diện điều khiển. Do đó, Python nghĩ rằng không có giao diện điều khiển và vào chế độ không tương tác. Vì vậy, nếu bạn vẫn muốn chế độ tương tác thay thế, bạn cần phải nói rõ ràng với Python để sử dụng nó.Tuy nhiên, nó vẫn sẽ không hoạt động như bình thường - người ta vẫn không thể sử dụng các phím mũi tên TRANG CHỦ hoặc TRÁI, và cứ như vậy.

+4

Vậy tại sao chúng tôi không thể sử dụng các phím mũi tên TRANG CHỦ hoặc TRÁI? Có cách nào để khắc phục điều đó? – bourbaki4481472

+0

@Timur: Đây là câu trả lời tôi đang tìm kiếm. Cảm ơn lệnh. Thêm nó vào bash_profile giải quyết vấn đề, nhưng làm cho mọi cuộc gọi đến python tương tác trong Cygwin. Cảm ơn một lần nữa cho giải pháp thực sự giúp. – Doogle

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