2012-11-27 42 views
30

Cài đặt một hệ thống Windows mới, tôi đã cài đặt Cygwin và 64 chút Python (2.7.3) trong vị trí mặc định của họ (c:\cygwinc:\Python27\python), và thêm cả bin Cygwin và Thư mục Python vào đường dẫn của tôi (trong biến người dùng PATH). Từ cửa sổ lệnh bình thường, Python khởi động hoàn hảo, nhưng khi tôi gọi nó từ bash trong môi trường CygWin, nó bị treo, không bao giờ đưa ra lời nhắc nhập liệu của tôi.Gọi trăn dưới Cygwin trên Windows bị treo

Tôi đã thực hiện điều này trên các máy khác, trước đây, nhưng luôn có phiên bản cũ hơn của Python (32 bit) và CygWin và với Python ở vị trí không chuẩn. Có ai khác có vấn đề này hoặc ai đó có thể cho tôi biết điều đó có thể là do?

Trả lời

28

Vấn đề là do cách thiết bị đầu cuối Cygwin (MinTTY) hoạt động, bản dựng Windows gốc của Python không nhận ra rằng thiết bị đầu cuối là thiết bị đầu cuối - nó nghĩ đó là một đường ống, vì vậy nó chạy không chế độ tương tác thay vì chế độ tương tác, và nó hoàn toàn bộ đệm của nó đầu ra thay vì dòng đệm nó.

Lý do điều này là mới có khả năng vì trong cài đặt Cygwin trước đó của bạn, bạn không có MinTTY và thiết bị đầu cuối được sử dụng chỉ là thiết bị đầu cuối Windows chuẩn.

Để khắc phục điều này, bạn cần chạy Python từ thiết bị đầu cuối Windows thông thường (Cmd.exe) hoặc cài đặt phiên bản Cygwin của Python thay vì bản dựng Windows gốc của Python. Phiên bản Cygwin (có thể cài đặt như một gói thông qua Cygwin's setup.exe) hiểu các thiết bị đầu cuối Cygwin và hoạt động phù hợp khi chạy qua MinTTY.

Nếu phiên bản cụ thể của Python bạn muốn không có sẵn dưới dạng gói Cygwin, bạn cũng có thể tải xuống mã nguồn của Python và tự xây dựng nó dưới Cygwin. Bạn sẽ cần một chuỗi công cụ biên dịch Cygwin nếu bạn chưa có (GCC), nhưng sau đó tôi tin rằng nó nên biên dịch với lệnh ./configure && make && make install tiêu chuẩn.

+1

+1 - chuyển từ Windows Python27 sang Cygwin Python32 cũng đã giải quyết được vấn đề này. – mouviciel

+2

Cảm ơn. Tôi không thể thay đổi phiên bản của Python (không cài đặt 2 phiên bản, một cho CygWin, một cho mọi thứ khác), bởi vì nó là một phần của chuỗi xây dựng sản xuất của chúng tôi. Nhưng 'python -i' hoạt động và việc tạo một bí danh trong' .bashrc' có lẽ là một giải pháp có thể chấp nhận được. –

+4

[Câu trả lời này] (http://stackoverflow.com/a/9549255/9530) cũng đưa ra một số gợi ý khác mà trước đây tôi không biết - chạy Python bằng công tắc dòng lệnh '-u' hoặc đặt biến môi trường' PYTHONUNBUFFERED = 1' sẽ thay đổi hành vi đệm của Python. –

40

Hãy thử điều này

python -i 

và có bạn sẽ tìm thấy một số trục trặc ở đây và ở đó !!!

10

Tôi gặp vấn đề tương tự với Mercurial (hg) + OpenSSH, Python và MinTTY, nhưng dưới MSYS thay vì CygWin. Tuy nhiên, theo như tôi có thể nói, cả vấn đề này và vấn đề của tôi đều do MinTTY gây ra không phải để xử lý các ứng dụng sử dụng các chức năng của bàn điều khiển Windows (trong câu trả lời ở đây bởi Adam, anh ta giải thích chi tiết cho Python).

Đối với tôi, tôi theo các giải pháp được tìm thấy trong bình luận 64 của https://code.google.com/p/mintty/issues/detail?id=56#c64

Với winpty (https://github.com/rprichard/winpty) dự án biên soạn và trong con đường của tôi, tôi đã có thể chạy mẹ đẻ Python (trong chế độ tương tác) và Mercurial từ vỏ MINTTY không có các công tắc hoặc công tắc đặc biệt (chẳng hạn như python -i). Tất cả những gì tôi cần là nối thêm console.exe hoặc console trước lệnh python hoặc hg. Để thuận tiện, tôi đã thêm các bí danh như alias hg="console.exe hg" vì vậy tôi có thể sử dụng các lệnh giống nhau cho dù tôi đang ở trong một vỏ Linux hay một trình bao bash Windows MinTTY.

Ngoài ra, giải pháp này dường như hoạt động đối với nhiều ứng dụng gốc hơn ngoài python và hg. Ví dụ: chạy mysql (có hoặc không có -p) sẽ có cùng một vấn đề (ví dụ: "treo" không có lời nhắc nhập). Gửi thêm console để cho phép nó như thường lệ.

+2

Tôi * cuối cùng * đã nhận được 50 điểm danh tiếng để nói THANK YOU !. Trong khi '-i' hoạt động trong hầu hết các trường hợp, chúng tôi có phần mềm phòng thí nghiệm chạy chủ yếu là Cygwin, nhưng sau đó gọi ra một cửa sổ python vì nó cần ctypes.WinDLL. Cuộc gọi giành chiến thắng này có lời nhắc ipython được nhúng và điều đó đã được làm rối tung lên mintty (các tab/mũi tên không hoạt động, tất cả đều ngốc nghếch). Đây là giải pháp dễ nhất và tốt nhất - làm việc như một sự quyến rũ. Trong bash script, chỉ cần "console.exe C: \ Python27 \ python.exe" và bây giờ nhúng ipython hoạt động tuyệt vời! Đã được kéo tóc ra, gây ra trên cửa sổ 64 bit, mintty chỉ là trò chơi thiết bị đầu cuối trong thị trấn. –

1

Đối với quản lý vị trí phi Cygwin của các phiên bản khác nhau của Python trong Cygwin:

$ /usr/sbin/alternatives.exe 

Sử dụng -install và các tùy chọn --config đây, nó hoạt động giống như update-alternatives trên một hệ thống Linux. Tôi đang sử dụng phương pháp này cùng với phương pháp python -i và hoạt động tốt.

Tôi cũng phải xóa các tệp liên kết đối tượng trong /usr/bin trước tiên, vì chúng được cài đặt bằng python của CygWin và không được quản lý qua alternatives.exe ban đầu.

0

Giải pháp của tôi liên quan đến việc viết kịch bản lệnh shell để chạy ứng dụng python.

python file.py "[email protected]" | tee /dev/null 

Lệnh thêm tee đó (không đến đâu) dường như khắc phục được sự cố.

-1

Cài đặt lại mintty với việc thiết lập Cygwin. Không cần phải sử dụng python -i sau đó.

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