Python
windows7

Windows上複数のpython環境でパス解決にハマった問題解決メモ

More than 1 year has passed since last update.

WindowsでPython環境が複数インストールされている時にありがちな、(パッケージがインストールされている場所)のパス解決問題についてです。ややこしいものです。

環境

OS 環境:Windows7 Enterprise Edition (64-bit) SP1
Python 環境:Python 2.6(ArcGIS Desktopから)とPython2.7(Python Canopyから)
*ここでWindowsシェルとCLI(Command Line Interface)という用語を同じ意味で使います(Command Promptに限らずその他Windowsで使えるシェルにも該当する内容という意味で使っています)。

背景

Windowsシステムに最初からArcGIS 10インストールの一部としてPython2.6の環境が入っていました。その後IDLEとEnthoughtのCanopy(Python用のIDE・エディターのバンドル)としてPython2.7の環境をインストールしました。

問題の概要

多くの場合、Canopyのパッケージマネージャーやpipからインストールしたライブラリーを使った時に、CanopyやIDLEからimportが無事に解決できても、今度Windows CLIなどのシステムシェルからImportErrorになります。

image.png
(インポート成功)

image.png
(インポート成功)

image.png
(インポート失敗)

解決メモ

まず、Canopyの使うPython環境とWindowsシェルが呼びだす、システムのデフォルトPython環境は違うようです。(システムが呼びだすデフォルト環境は、ArcGISからシステムにPython環境が初めてインストールされた時に設定されたと思われます。)

1.呼び出したいパッケージの場所を確認
今回はyamlとawsscliのインポートしたく検索かけます。すると、AppData¥Local¥Enthought¥Canopy¥User¥Lib¥site-packagesにyamlがありました。
image.png

awscliがAppData¥Roaming¥Python¥Python27¥site-packagesにありました。
image.png

ついでに、pipのインストールダイレクトリーを確認:
image.png
pipもPython27¥site-packagesを利用しているそうです。

つまりPythonにこの二つのダイレクトリーを利用して貰う必要あります。

2.システムとCanopyがそれぞれ参照しているPATH変数を確認しました。

import sys
print(sys.path)

Canopyからの出力:
image.png
いっぱい出ますね。予想通りに
AppData¥Local¥Enthought¥Canopy¥User¥Lib¥site-packages
AppData¥Roaming¥Python¥Python27¥site-packages
が入っています。

Windows CLIからの出力:
image.png
やっぱりほぼArcGISのPython2.6環境を参照していますね。
上記二つダイレクトリーが入っていません。

*これがシステムからCanopyやpipからインストールしたものが見つからない原因です。

3.Pythonがパッケージ検索に使うパスを指定しないと!

まずは、Pythonはimportの時どこでパッケージを探すのでしょうか?
1) Built-in(最初からPythonに入ってる組み込みモジュール)を探す
2)そこになければ現在のダイレクトリー(pwd)で探す
3) そこになければPYTHONPATH変数の各ダイレクトリーで探す
4) そこになければPythonのセットアップ時に指定されたデフォルトダイレクトリーで探す(今回多分ArcGISのPython2.6用ダイレクトリーになります)

yamlとawscliは(1)、(2)、(4)でもないので弄るのは(3)ですね。。

これに関して様々な方法があります。
-Pythonシェルからpath変数に直接ダイレクトリー名を追加することも出来ます → 
複数のPython環境が入っている場合、各環境から個別で設定する必要があってめんどくさいです

-Windowsの環境変数を設定するという方法 →
全Python環境に影響するのでこれで行きました。

*ちなみに、似てるがWindowsのPATH 変数で設定はNGです。
PythonPathはWindowsのシステムPATH変数を参照しません。

システムにPYTHONPATHが設定されていなかったので新規変数として追加しました。
SyntaxはWindowsのPATH変数と変わらないです。
image.png

PYTHONPATHに以下入れました:
AppData¥Local¥Enthought¥Canopy¥User¥Lib¥site-packages;AppData¥Roaming¥Python¥Python27¥site-packages

4.PythonのPathが更新されたことを確認
Windowsシェルを再起動し、sys.pathを出力するスクリプトを呼びだす。
今回の出力は以下です:
image.png

それで、もう一回yamlをimportするpythonスクリプトをWindowsシェルから呼び出します。
image.png
今回ImportError無しです。

...という訳で、IDEやpipでインストールし、IDEやPythonシェルでインポート出来るがWindowsのシェルからインポート出来ないパッケージの問題に関しては、PYTHONPATHのシステム変数を設定することで割と楽々にパス解決が出来ます。

詰まった時に是非試してみてください。
(Windowsめんどい~)