web-dev-qa-db-ja.com

Windowsを使用するPython Cygwinから

最近、WindowsでCygwinを使用しています。 PythonのWindowsインストールを使用したいので、テスト中は/cygdrive/c/Python26/python.exe myfile.pyではなくpython myfile.exeを使用しています。

これは、印刷を除いてほぼ完璧に機能しています。 CygwinからWindows Pythonを実行すると、実行が完了するまで出力は出力されません。 Explorer.exeまたはcmd.exeのWindows Pythonで正常に動作し、CygwinでインストールされたPython(/bin/python.exe)を使用してCygwinで動作します。

これに対する回避策はありますか?重要なことは、Windowsバージョンを実行できるようにすることですが、Bashですべてを実行したいと思います。

61
Skilldrick

おそらく出力をフラッシュする場合

import sys

V = range(100000)
for x in V:
    print x
    sys.stdout.flush()
24
Amro

本当の問題は、minttyなどのCygwin端末プログラムでコマンドを実行すると、Windowsコンソールとして動作しないことです。 CMDやConsole2などのWindowsコンソールベースのものだけがそれを行います。そのため、Cygwin端末では、Windowsのpython.exeは対話型コンソールと通信しているとは見なしません。

対話型セッションで行われているように、すべての行でバッファをフラッシュする代わりに、出力をバッファリングします。そのため、Amroがすべての行にflush()を追加すると症状が修正されますが、コードを変更することになります。

コードを変更しない1つの解決策は、コマンドラインで「-u」フラグを使用するか、環境変数PYTHONUNBUFFEREDを設定して、Pythonでのバッファリングをオフにすることです。

export PYTHONUNBUFFERED=1

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

または

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

または対話モードで実行する

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

また、CygwinターミナルでWindowsのpython.exeインタラクティブモードを実行することもできません。対話型セッションは起動しませんが、ハングします。私は最良の解決策は「cygstart」を使用することであると思う(「-i」オプションを使用するよりも良い):

cygstart /cygdrive/c/Python27/python.exe

そして、それはipythonでも動作するようです(インストールされている場合):

cygstart /cygdrive/c/Python27/Scripts/ipython.exe
117
noisygecko

最初の質問には答えませんが、Cygwinターミナル内(たとえば、mintty内)からPythonインタラクティブセッションを使用する場合-start Python with "-i"対話モードで実行する必要があることを明示的に伝えるオプション:

$ python -i

巧妙な方法は、.bashrcにエイリアスを作成することでもあります(とにかくインタラクティブなターミナルセッションに対してのみ読み取られることを認識しています)。

alias python='python -i'

それ以外の場合、Pythonは、コンソールで実行されることを認識しません。これは、すべてのCygwin ptyベースの端末(mintty、rxvtおよびxterm)がコンソールではなくWindowsによってパイプとして認識されるためです。したがって、 Pythonコンソールがないと判断し、非対話モードに入ります。そのため、代わりに対話モードが必要な場合は、明示的にPythonを使用してください。 。ただし、通常どおりに動作しません-ホームキーまたは左矢印キーなどを使用することはできません。

38
Timur