LoginSignup
10

More than 5 years have passed since last update.

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

Posted at

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めんどい~)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10