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

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](https://qiita-image-store.s3.amazonaws.com/0/207342/6f38d476-3349-82a2-0889-36bb007661dd.png)
（インポート成功）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/207342/c95f6fb0-fd93-489e-caa2-6e62a0ce7cbf.png)
（インポート成功）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/207342/29e509da-fe82-7b20-6c10-28e3724c7bd9.png)
（インポート失敗）


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

１．呼び出したいパッケージの場所を確認
今回はyamlとawsscliのインポートしたく検索かけます。すると、AppData￥Local￥Enthought￥Canopy￥User￥Lib￥site-packagesにyamlがありました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207342/a31c3ea2-d89a-8685-31a9-bb9dcdc12a29.png)

awscliがAppData￥Roaming￥Python￥Python27￥site-packagesにありました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207342/eed4934a-3019-fe6b-e420-10c4b6d42f81.png)

ついでに、pipのインストールダイレクトリーを確認：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207342/a870a96c-3bde-4ab8-883c-6e2927cfc202.png)
pipもPython27￥site-packagesを利用しているそうです。

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

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

```
import sys
print(sys.path)
```
Canopyからの出力：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207342/22a54c09-b81e-0255-2ded-1a6b5c82a44d.png)
いっぱい出ますね。予想通りに
AppData￥Local￥Enthought￥Canopy￥User￥Lib￥site-packages
AppData￥Roaming￥Python￥Python27￥site-packages
が入っています。

Windows CLIからの出力：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207342/55e410ab-0cb7-3788-33f2-edff78a62d21.png)
やっぱりほぼArcGISのPython2.6環境を参照していますね。
上記二つダイレクトリーが入っていません。

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

３．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](https://qiita-image-store.s3.amazonaws.com/0/207342/46761d67-f3fd-2b1e-a18b-a01fe8e79452.png)

PYTHONPATHに以下入れました：
AppData￥Local￥Enthought￥Canopy￥User￥Lib￥site-packages；AppData￥Roaming￥Python￥Python27￥site-packages

４．PythonのPathが更新されたことを確認
Windowsシェルを再起動し、sys.pathを出力するスクリプトを呼びだす。
今回の出力は以下です：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207342/3baae630-6a7e-34de-9a3b-2881a1e6e118.png)

それで、もう一回yamlをimportするpythonスクリプトをWindowsシェルから呼び出します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207342/1fdc0a42-de2a-0bd8-46d1-a4ae72a9377a.png)
今回ImportError無しです。


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

詰まった時に是非試してみてください。
（Windowsめんどい～）