寒月記

住みにくいところをどれほどか寛容て

Windows の pipenv shell でも履歴機能が使いたい

背景

Python 仮想環境として pipenv を利用しているのですが、Windows のコマンドプロンプトでは、pipenv shell で起ち上げた仮想環境のサブシェルの中で ↑↓ によるコマンド履歴表示が効かない という問題に直面したため、回避策をまとめました。

環境

  • OS: Windows 10 Pro
  • Python: 3.7.0
  • pipenv: 2018.7.1
  • PowerShell: 5.1.17134.228

試したが駄目だったこと

コマンドプロンプトで何とかする方法はないか?

以下の issue で取り上げられていますが、2018/9/12 現在解消法はないようです。 up/down arrow history doesn't work on pipenv shell on windows #876

Git Bashではどうか?

Git Bash や Cygwin では、Python が パスを取り違えていろいろと不具合が起きるようで、非推奨かつ不具合の素のようです。 pipenv shell does not work when running Git for Windows' bash on Windows #2623

実際に試した結果がこちら。 f:id:kan-getsu:20190428201510p:plain Launching subshell in virtual environment とありますが、その後文字化けもしていて、かつ pip list の結果がサブシェルに入る前後で変わっていません。 本当は、仮想環境中には flask などが入っています。

ファイルパスが変わって os.path が変わってしまうからしょうがないようです。そもそも Python 自体起動できない...... 回避策もないことはないようですが、何を変更していてどんな副作用があるか理解できる人でないと、推奨はしないとのことです。

回避策

そしてたどり着いた回避策が、PowerShell を使う です。

自分の業務だと Windows ではコマンドプロンプトにしか触れず、bat ファイルを作ることはあっても ps1 ファイル*1を作ることはなかったため、避けていました。

しかし、PowerShell 上では、pipenv shell 中 ↑↓ での履歴が呼び出し使えました! f:id:kan-getsu:20190428202347p:plain Git Bash のときと違い、ちゃんと pipenv shell の前後で pip list の結果も変わっていますね。

なお、個人的に PowerShell のデフォルトの背景色、フォントがしっくりこなかったため、変更しています。 フォントは、最近 (言うほど最近でもないけど) 話題の、Adobe・Google 製の「源ノ角ゴシック」を TrueType に変更した、源真ゴシック の等幅フォントを利用しています。 ダウンロードはこちらから。 http://jikasei.me/font/genshin/

解凍後、利用したいフォントの ttf ファイルを右クリックからインストールすれば、利用可能となります。

また、PowerShell で文字がない状態でバックスペースを押すとビープ音が鳴るのがいやだったので、こちらのサイト様の記事を参考に設定を変更しています。 https://ite.cexen.info/powershell-%E3%82%92%E4%BE%BF%E5%88%A9%E3%81%AB%E4%BD%BF%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE%E8%A8%AD%E5%AE%9A/

なお、記事中で実際に対応するのは

  • .ps1 ファイルを実行可能にする
  • プロファイルを作成する
  • 補足:ビープ音を消す

だけで大丈夫です。 上記サイト様では emacs 風キーバインドの利用を前提にコマンドを書かれています。 標準の設定ならば、ビープ音消去の設定はプロファイルに

Set-PSReadlineOption -BellStyle None

と記載するだけで問題ありません。

これで最低限の設定も完了し、Windows でも快適に pipenv shell が使えます!

補足:それでも気になったこと

それでもやはり気になることが 2点ほど。

1. 利用中の仮想環境を示す表示が出ない

上に貼った PowerShell の画像を見ていただけると分かるのですが、コマンドプロンプトでの利用時は出ていた、利用中の仮想環境名を示す表示がありません。 コマンドプロンプトでは、カレントディレクトリを示す表示の左に、() で仮想環境名を表示していて、今仮想環境にいるのかどうかが一目瞭然でした、これが使えないのは残念。

2. PowerShell のプロパティのフォントタブを開くたびに出るダイアログがうるさい

これはフォントの変更に起因するのですが、PowerShell プロパティのフォントタブを開くと、「ポイント サイズには 5 から 72 を指定してください。」というダイアログが 4、5回出てきてうっとうしいです。

軽く調べたり、レジストリいじってみたりしましたが、回避策は現状なさそうです。 一度設定してしまえばそう頻繁に開くところでもないので、我慢。

結論

以上、Windows で pipenv shell を使う方は、PowerShell で使うと少し快適になる と思います。 そのほかの回避策や問題の回避策など、ありましたらコメントいただけると幸いです。

*1:PowerShell用の batのようなもの