2011年11月21日月曜日

virtualenvを使ってWindows上にPython環境を構築した (2)


前回の記事で「ユーザー環境変数でパスも通しておく」と書いたにもかかわらず、設定をきちんとしていなかった。Djangoを動かそうと思って、django-admin.pyを実行すると、モジュール検索パスでdjango.coreを見付けられなかった。

C:\Users\Keiichiro>django-admin.py
Traceback (most recent call last):
  File "C:\Users\Keiichiro\Python27\Scripts\django-admin.py", line 2, in <module> from django.core import management
ImportError: No module named django.core
ただし、直接Pythonのコンソールからはインポート可能(エラーが出ない)

C:\Users\Keiichiro>python
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>>

現状、下記のフォルダには環境変数Pathを追加している。だから、Scriptsフォルダにあるdjango-admin.pyは絶対パスでなくとも実行可能。
%HOMEDRIVE%%HOMEPATH%\Python27;
%HOMEDRIVE%%HOMEPATH%\Python27\Scripts 
Pythonは下記の2箇所に入っている。上は公式サイトからのWindowsバイナリ、下はvirtualenvで追加したもの。
C:\Python27
C:\Users\Keiichiro\Python27
結果として、下記のPYTHONHOMEを追加することでモジュール検索パスの問題は解決。ちなみにvirtualenvでは環境変数の切り替えとかもサポートしているのだろうか。


1. 環境変数PYTHONHOMEを追加。# PYTHONPATHではなく。


PYTHONHOME=%HOMEDRIVE%%HOMEPATH%\Python27\Scripts
しかし、うまくいかない。今度はsiteモジュールが見つからない、と。virtualenvのお作法に従っていないのが問題か。

C:\Users\Keiichiro>django-admin.py
ImportError: No module named site
virtualenvのほうのScriptsフォルダにactivate-this.batなるバッチファイルを見付けた。こいつを使う模様。中身はこんな感じ。

@echo off
set VIRTUAL_ENV=C:\Users\Keiichiro\Python27
if not defined PROMPT (
    set PROMPT=$P$G
)
if defined _OLD_VIRTUAL_PROMPT (
    set PROMPT=%_OLD_VIRTUAL_PROMPT%
)
if defined _OLD_VIRTUAL_PYTHONHOME (
     set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
)
set _OLD_VIRTUAL_PROMPT=%PROMPT%
set PROMPT=(Python27) %PROMPT%
if defined PYTHONHOME (
     set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%
     set PYTHONHOME=
)
if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%; goto SKIPPATH
set _OLD_VIRTUAL_PATH=%PATH%
:SKIPPATH
set PATH=%VIRTUAL_ENV%\Scripts;%PATH%
:END
実行。プロンプトの文字列に(Python27)が追加されている。が、作法に従っていないせいか、OLD_VIRTUAL_* の環境変数が設定されておらず、条件分岐の中のsetを通らない。
C:\Users\Keiichiro>activate.bat
(Python27) C:\Users\Keiichiro>django-admin.py
Traceback (most recent call last):
  File "C:\Users\Keiichiro\Python27\Scripts\django-admin.py", line 2, in <module
>
    from django.core import management
ImportError: No module named django.core
スクリプトをよく見ると、21行目でPYTHONHOMEをわざわざ空にしていた。ここにVIRTUAL_ENVを追加するよう変更。しかしなぜ空にする?VIRTUAL_ENVの値を追加するだけで便利になるのに。PYTHONHOMEって必要ない値なのか。(そのおかげで自分は難儀したが)
if defined PYTHONHOME (
     set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%
     set PYTHONHOME=%VIRTUAL_ENV%
)
本家ドキュメントで環境変数のこと、もっときちんと勉強しないといけないかな。 


0 件のコメント:

コメントを投稿