競プロ雑記帳

MSYS2上でVanilla Pythonが動かない

追記 (2021/05/07)

下記のことをしたらMSYS2上でsshが使えなくなりました。
おそらく、MSYSのsshではなくWindows標準のsshを使っていることが原因になっていそうです(MSYSのsshを明示的に指定したら上手くいったため)。
似たような不具合がかなりありそうなので、aliasを作るなどで解決できる場合はそうした方がよさそうです。


この前、MSYS2側にWindowsのPATHを渡す設定をしたので、Vanilla PythonをMSYS2上で動かそうと思ったら、MSYS2のPythonが動いてしまったのでそれを解決したときのメモ

※あまり詳しくないので、下記のようにする場合は自己責任でお願いします。

とりあえず

where python

をしてみると、4つくらい表示されて "C:\msys64..." から始まる python.exe が上にあったので優先順位を変更すれば治りそう。

自分の場合はPythonに限らず、Windows側のアプリケーションが優先されてほしいのでPATHの順番を変更することにした。

/etc/profile を変更すればよさそうなので、ファイルを見る。
それっぽい部分が49行目くらいにあるはずなのでこれのPATHの部分
を変える。

case "${MSYSTEM}" in
MINGW*|CLANG*|UCRT*)
  MINGW_MOUNT_POINT="${MINGW_PREFIX}"
  PATH="${MINGW_MOUNT_POINT}/bin:${MSYS2_PATH}${ORIGINAL_PATH:+:${ORIGINAL_PATH}}"
  PKG_CONFIG_PATH="${MINGW_MOUNT_POINT}/lib/pkgconfig:${MINGW_MOUNT_POINT}/share/pkgconfig"
  ACLOCAL_PATH="${MINGW_MOUNT_POINT}/share/aclocal:/usr/share/aclocal"
  MANPATH="${MINGW_MOUNT_POINT}/local/man:${MINGW_MOUNT_POINT}/share/man:${MANPATH}"
  ;;
*)
  PATH="${MSYS2_PATH}:/opt/bin${ORIGINAL_PATH:+:${ORIGINAL_PATH}}"
  PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/share/pkgconfig:/lib/pkgconfig"
esac

これを下記のように変更する。

case "${MSYSTEM}" in
MINGW*|CLANG*|UCRT*)
  MINGW_MOUNT_POINT="${MINGW_PREFIX}"
  PATH="${ORIGINAL_PATH:+${ORIGINAL_PATH}:}${MINGW_MOUNT_POINT}/bin:${MSYS2_PATH}"
  PKG_CONFIG_PATH="${MINGW_MOUNT_POINT}/lib/pkgconfig:${MINGW_MOUNT_POINT}/share/pkgconfig"
  ACLOCAL_PATH="${MINGW_MOUNT_POINT}/share/aclocal:/usr/share/aclocal"
  MANPATH="${MINGW_MOUNT_POINT}/local/man:${MINGW_MOUNT_POINT}/share/man:${MANPATH}"
  ;;
*)
  PATH="${ORIGINAL_PATH:+${ORIGINAL_PATH}:}${MSYS2_PATH}:/opt/bin"
  PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/share/pkgconfig:/lib/pkgconfig"
esac

実際に変更した箇所は、「PATH="..."」とある部分。
一応二ヵ所あるので両方とも $ORIGINAL_PATH が先になるようにした。
ORIGINAL_PATH にWindowsのPathが入っているので、それを先に書くことで優先順位を上げた。

${ORIGINAL_PATH:+:${ORIGINAL_PATH}} は ORIGINAL_PATH に値が入っていれば :${ORIGINAL_PATH} を入れるという意味なのでコロンの位置を元とは変える必要がある。

変更した後、ターミナルを開いて再び

where python

とすると、Vanilla Pythonが上に来ている。

また

echo $PATH |  tr ':' '\n' #そのままだと見にくいので改行

とすると、Windows側のPathが上に来ていることが確かめられる。

余談
winpty python

としないと対話モードで実行できないので注意。
対話モードでなくとも print の出力がされない?
適当な場所に alias を追記しておくと便利。