amazon

25.12.12

Mac Python パッケージのパス

前回の記事で扱ったようにMacでは異なるPythonをインストールできる。
そのためライブラリのインストール先もそれぞれのPythonで異なるので注意。
以下はnumpyをインストールしたときの例。

MacPortsでインストールするとデフォルトでは、
/opt/local/var/macports/software

*.dmgファイルからインストールすると、
/Library/Frameworks/Python.framework/Versions/*.*/lib/python*.*/site-packages
(*.*はバージョン)
に保存される。


ライブラリのインストールが成功したのに、import時に、
>>> import ***
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named ***
こんなエラーが出てしまうときは、インストールしたライブラリがどこにインストールされたのか、また呼び出しているpythonがどのpythonなのか、確認してみるとよい。

pythonのパスを確認する方法はpythonで、
>>> sys
>>> sys.path

インストールされているpythonの一覧はターミナルで、
$ type -a python

前回の記事も参考にしてください。

17.11.12

MacPortsでインストールした複数バージョンアプリの切替 (pythonの場合)

MacPortsでインストールしたアプリが複数バージョン共存している環境で、
特定のバージョンを指定したい場合以下の方法で行う

まず、インストールされているバージョンの確認(僕の環境の例)
$ python -V
Python 2.7.3
また、ターミナルで「python」というコマンドにひも付け(リンク)されているファイルがどこにあるかは、
$ which python
または、
$ type python
であるが、オプション-aをつければひも付け(リンク)の一覧を表示できる
$ which -a python
/Library/Frameworks/Python.framework/Versions/2.6/bin/python
/Library/Frameworks/Python.framework/Versions/2.7/bin/python
/usr/local/bin/python
/usr/bin/python
/opt/local/bin/python

$ type -a python
python is /Library/Frameworks/Python.framework/Versions/2.6/bin/python
python is /Library/Frameworks/Python.framework/Versions/2.7/bin/python
python is /usr/local/bin/python
python is /usr/bin/python
python is /opt/local/bin/python

で、本題のバージョンの切替は以下のコマンド
ここではpython2.6に切り替えた
$ sudo port select --set python python26
$
$ python -V
Python 2.6.6
ちなみに、selectできる一覧は以下のようにして表示出来る
$ port select --list python
Available versions for python:
none
python25-apple
python26 (active)
python26-apple
python27
python32

今回は、64bitのMacではpython2.7用のNumpyが動かないのでダウングレードした次第
ひも付け(リンク)の変更だけならaliasでもできる

追記1
この記事はMacPortsのひも付けの話。
僕の環境では、alias python="/opt/local/bin/python"としてあります。 つまり、pythonを呼び出すと/opt/local/bin/pythonが呼び出され、MacPortsで指定したバージョンが呼び出されるということです。

追記2
ターミナルでpythonと打った時に呼び出されるpythonについてはこちら

15.10.12

Arduino外部ライブラリイントール時のerror

こちらのサイトを参考にArduinoをSleep.hを使ってスリープしようと試みたときのエラーについて。
環境はMacだ。

ライブラリのインストール先は、
/Applications/Arduino.appで右クリックし「パッケージの内容を表示」した先。
/Applications/Arduino.app/Contents/Resources/Java/libraries/に
SleepとWatchdogというフォルダを作成し、Sleep.h, Sleep.cppとWatchdog.h, Watchdog.cppを移動。

で、参考ページの通りにコードを書いてコンパイルすると次のエラーが出た。
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp: In member function 'void WatchdogClass::enable(uint8_t)':
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp:38: error: 'cli' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp:43: error: 'sei' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp: At global scope:
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp:50: error:
expected constructor, destructor, or type conversion before '(' token
WatchdogClassのenableメソッドで、cli();やsei();が宣言されていないということだ。
cliやseiは割り込みに関するマクロだそうだ。(参考)

そこで、avr/interrupt.hをインクルードする。
Watchdog.hまたはWatchdog.cppに
#include <avr/interrupt.h>
これで先のエラーは消えるが、今度は、
/Applications/Arduino.app/Contents/Resources/Java/libraries/Sleep/Sleep.cpp: In static member function 'static void SleepClass::powerDownAndWakeupExternalEvent(uint8_t)':
/Applications/Arduino.app/Contents/Resources/Java/libraries/Sleep/Sleep.cpp:56: error: 'LOW' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/Sleep/Sleep.cpp:56: error: 'attachInterrupt' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/Sleep/Sleep.cpp:58: error: 'detachInterrupt' was not declared in this scope
となる。

SleepがArduinoで宣言されている定数を認識できていないということだ。

Arduinoの定数の宣言は/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Arduino.hでされているので、
Sleep.hまたはSleep.cppに次のようにヘッダーをインクルードすればよい。
#include <Arduino.h>