virtualenv(1.11.6) + windows 7で複数のPythonバージョン(64bit, 32bit含む)を使おうとすると失敗する件

仕事で久々にWindowsのPythonを使おうと、pipのアップグレードやら入れてあるモジュールをアップグレードしてまして、

virtualenvも1.11.6となってましたが、それを利用してpython2.7.8とpython3.4.2の仮想環境をつくろうとしたらエラーが出て戸惑った話です。

要約

  • Virtualenv 1.11.6にて、64bitOSに32bitのPythonを複数バージョンごとに入れて、virtualenvをインストールしたバージョン以外のpython環境を指定して仮想環境をつくろうとするとエラーが起こる
  • virtualenv側でPythonのインストールされているリストを調べに行くコードに不具合がある
  • 修正はされているが、develop branchにあるので、githubのdevelop branchのモノをインストールすると動く
  • コード側のバージョンは1.12devとなってるので、1.12がリリースされたら改善しているはずです。
  • インストール方法は公式のドキュメントを見ればわかります。

本題

PS C:\Users\hiroshi> virtualenv --python="C:\python34\python.exe" testpy2
Traceback (most recent call last):
  File "C:\Python27\lib\runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "C:\Python27\lib\runpy.py", line 72, in _run_code
    exec code in run_globals
  File "C:\Python27\Scripts\virtualenv.exe\__main__.py", line 9, in <module>
  File "C:\Python27\lib\site-packages\virtualenv.py", line 774, in main
    interpreter = resolve_interpreter(options.python)
  File "C:\Python27\lib\site-packages\virtualenv.py", line 1575, in resolve_interpreter
    python_versions = get_installed_pythons()
  File "C:\Python27\lib\site-packages\virtualenv.py", line 93, in get_installed_pythons
    path = winreg.QueryValue(python_core, "%s\\InstallPath" % ver)
WindowsError: [Error 2] 指定されたファイルが見つかりません。

どういった環境にしてあるかというと

  • windows 7 64bitの環境に
  • python2.7.8 32bitを入れる
  • python3.4.2 32bitを入れる
  • 環境変数のPATHは2.7を前にしています。
  • C:¥Python27;C:¥Python27¥Scripts;C:¥Python34;C:¥Python34¥Scripts
  • 2.7側にpipを入れる(get-pip.py)
  • virtualenvを入れて2.7の環境は作れる
  • (virtualenvwrapper-powershellも2.7系に入れてます)

で、2.7に入れてあるvirtualenvでpy3kの仮想環境をつくろうとするとこのエラーが出てしまうのです。

最初、(久々にWinのpythonを動かしたよ。3.4.1と3.4.2が一緒に入ってるしわけわからん)しばらく使ってなかったのでどういった環境構成かを忘れていたので、一度アンインストールして再インストール+pip経由でモジュールなど入れなおした状態でした。

初めて見たエラーだったし、環境側の問題ではなさそうで、このエラーについて調べてみると、公式のissuesに登録された問題でした。

簡単に言うと、Pythonのインストールされているバージョンの一覧を取得するために、レジストリを探しに行っているようですが、64bitOSのWinに32bit版のPythonを入れた状態だと、virtualenvで指定してあるレジストリのエントリに存在しないらしいです。

  • 64bit : HKLM\SOFTWARE\Software\Python\PythonCore
  • 32bit : HKLM\SOFTWARE\Wow6432Node\Python\PythonCore

ということで、探しに行くように書き換えた結果がこれだそうです。

Protect registry calls with try...except so that not having an installed... · 2cb8fd6 · pfmoore/virtualenv

注意しないといけない点は、これはまだpypiでインストールできるバージョンに入っていません。1.11.6時点ではまだマージされていなくて、develop branchに入ってます。ので、公式のドキュメントにも乗っている方法で、develop branchをインストールします。

Introduction — virtualenv 1.11.6 documentation

pip install https://github.com/pypa/virtualenv/tarball/develop

ちなみに期待通りに動いてます。良かった良かった :-D と言うか、なんで64bitOSに32bitのPython入れてるんだろ(汗)もう64bitなPythonでも全然問題ないよね。

About Me

買ったり作ったり考えたり試したの日々の記録です