私はパッケージをインストールするR機能に慣れており、ipython
で同じことをしようとしています。以下の方法が機能する場合と機能しない場合がありますが、機能しない場合があり、なぜそれが半分の時間しか機能しないのかを最終的に知りたいのです。
通常、モジュール(たとえばrequests
モジュール)をインストールするには、新しいターミナルを開いた後で次のように入力します。
$ Sudo pip install requests
Password: *******
次に、インストールが成功したか、すでにインストールされていることを示すメッセージが続きます。
Requirement already satisfied (use --upgrade to upgrade):
requests in /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages
Cleaning up...
これは、コードにアクセスできることを示唆しています。実際、私がpythonをターミナルから実行すると、エラーが発生することなく、良好な応答を示します。
$ python
ActivePython 2.7.2.5 (ActiveState Software Inc.) based on
Python 2.7.2 (default, Jun 24 2011, 12:20:15)
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>>
ここで、AlfredからPyLab
を開くと、エラーが発生します。
Welcome to pylab, a matplotlib-based Python environment [backend: WXAgg].
For more information, type 'help(pylab)'.
In [1]: import requests
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
/Users/vincentwarmerdam/<ipython-input-1-686486c241c8> in <module>()
----> 1 import requests
ImportError: No module named requests
StackOverflowの別の質問( here )からいくつかのヘルプを読みました。これは、ipython
Shellからモジュールをインストールすることを示唆しています。これにより、さらに不可解な応答が得られます。
In [2]: !pip install requests
Requirement already satisfied (use --upgrade to upgrade): requests in
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages
Cleaning up...
In [3]: import requests
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
/Users/vincentwarmerdam/<ipython-input-3-686486c241c8> in <module>()
----> 1 import requests
ImportError: No module named requests
これは私には非常に奇妙に思えます。システムに複数のバージョンのpythonがインストールされていますか?これを確認するにはどうすればよいですか?インストールされているコードの場所をipython
にポイントする必要がありますか?
実際にははるかにエレガントな解決策があります。 pipがインストールされると、python内で次のようなこともできます:
import pip
def install(package):
pip.main(['install', package])
install('requests')
簡単です。 virtualenvにログインすると、現在のセッションで必要なものが手元にあることを確認できます。
もう1つの方法は、%%bash
マジックを使用することです。
%%bash
pip install requests
標準出力が必要な場合は、感嘆符を使用することもできます。
! pip install requests
これが私がそれを機能させるためにしたことです。コマンドラインからiypthonを開き、次のように入力します。
import sys
sys.path
これは、他のpythonモジュールが配置されているフォルダのリストを示しています。私にとってこれは:
['',
'/Library/Frameworks/Python.framework/Versions/7.3/bin',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/pandas-0.10.0-py2.7-macosx-10.5-i386.Egg',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/googlemaps-1.0.2-py2.7.Egg',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/oauth-1.0.1-py2.7.Egg',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/oauth2-1.5.211-py2.7.Egg',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/httplib2-0.7.7-py2.7.Egg',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/Selenium-2.28.0-py2.7.Egg',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/jellyfish-0.2.0-py2.7-macosx-10.5-i386.Egg',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/python_Yelp-0.1.1-py2.7.Egg',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/pymongo-2.4.2_-py2.7-macosx-10.5-i386.Egg',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/lucene_querybuilder-0.1.6-py2.7.Egg',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/mechanize-0.2.5-py2.7.Egg',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/html2text-3.200.3-py2.7.Egg',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python27.Zip',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-darwin',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-mac',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-mac/lib-scriptpackages',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-tk',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-old',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-dynload',
'/Users/vincentwarmerdam/Library/Python/2.7/lib/python/site-packages',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/PIL',
'/Library/Python/2.7/site-packages',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/IPython/extensions]
この情報により、ipythonがインポートできるモジュールを探す場所がわかりました。そのため、リクエストライブラリを手動でダウンロードし、次のディレクトリが存在するように同じルートディレクトリに追加しました。
/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/requests
このフォルダーにはpython=リクエストに属するモジュールが含まれています。今私がしなければならないことは、このフォルダーが存在することをipythonが認識していることを確認することだけでした。sys.pathを更新することによって行われました。
req_link = '/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/requests'
sys.path.append(req_link)
この後、もうエラーは発生しません。
import requests
うまくいきます。
また、ipythonを再起動した後、ipythonがsys.path
リストへの新しいパスを自動的に更新することがわかりました。
インストールされた新しいパッケージがターミナルにインポートされてもipythonノートブックにはインポートされない場合、ライブラリに2つのバージョンのpythonがインストールされている可能性があります。これにより、個別のサイトパッケージがあります。ターミナルとipythonノートブックでパッケージがインポートされるディレクトリ。これが当てはまるかどうかを確認するには、ターミナルで次を使用します:
import sys
sys.path
これは、pythonモジュールがpythonでターミナルで使用している場所にある場所を示しています。今、ipythonノートブックで次のように使用します。
import sys
sys.path
これは、pythonモジュールがpythonでターミナルで使用している場合に、モジュールがどこにあるかを示しています。
2つのパスが異なる場合、Pythonの2つの異なるインストールを使用していることがわかります。この問題を解決するには、インストール済みのパッケージをターミナルpythonのsite-packagesディレクトリからipythonのsite-packagesディレクトリにコピーします。
Patoolをインストールしようとしたときにも同じ問題が発生しましたが、複数のインタープリターがインストールされていることが原因であることがわかりました。ipythonから実行したところ、問題なく動作しました。