仕事で久々に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に登録された問題でした。
- virtualenv 1.11.6 is broken on Windows · Issue #649 · pypa/virtualenv
- Windows 7: "The system cannot find the file specified" · Issue #505 · pypa/virtualenv
簡単に言うと、Pythonのインストールされているバージョンの一覧を取得するために、レジストリを探しに行っているようですが、64bitOSのWinに32bit版のPythonを入れた状態だと、virtualenvで指定してあるレジストリのエントリに存在しないらしいです。
- 64bit : HKLM\SOFTWARE\Software\Python\PythonCore
- 32bit : HKLM\SOFTWARE\Wow6432Node\Python\PythonCore
ということで、探しに行くように書き換えた結果がこれだそうです。
注意しないといけない点は、これはまだ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でも全然問題ないよね。