忍者ブログ
日々の研究生活のメモ書きなど

ググって見た感じ、pyzmqというモジュールのversionが古いのが原因っぽい
v16からv17に上げればOKだった
sudo port selfupdate
port outdated | grep "zmq"
sudo port upgrade py27-zmq
sudo port upgrade zmq

■ 参考 : Jupiter notebook のエラー 'AttributeError: type object ‘IOLoop’ has no attribute ‘initialized’'


ただ、そこまでして動くようになったjupyter notebookだけど環境設定で心が折れて使わなくなった・・・・










PR

■ ヒストグラムを書く

■ 参考 : [Python]Matplotlibでヒストグラムを描画する方法




■ フィッティング関連

pythonでのfittingには scipy.optimize.curve_fit を用いる

■ 参考 : SciPyフィッティング (fitting)


■ 参考 : scipy.optimize.curve_fit
によると、フィッティングの結果、共分散行列が得られる
この行列の対角成分はそれぞれのパラメーターの分散、標準偏差を表す

例 :
poptの
>>> popt, pcov = curve_fit(func, xdata, ydata)
>>> popt
array([ 2.55423706, 1.35190947, 0.47450618])
>>> plt.plot(xdata, func(xdata, *popt), 'r-',
... label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))

perr = np.sqrt(np.diag(pcov))
とすると、perrという配列にパラメーターの標準偏差が入っている








returnとyieldは別物
メソッドが呼び出されるごとに、どんどん進んでいくのがyield

↓の記事の説明がとてもわかりやすい

■ 参考 : python の yield。サクッと理解するには return と比較










クラスについてまとめるつもりだったけど、↓の記事のが詳しいから困ったらそっちを読むよろし(未来の自分へ)

■ 参考 : Python クラスについて





■ クラス
クラスは組み込み型のint型やlist型と同じように独自の属性やメソッドを備えたデータ型を作成できる
クラス作成はclass文で始める
class クラス名 :
 def メソッド名(self, ・・・):
  ・・・
 def メソッド名(seld, ・・・):
  ・・・


classを定義した後に呼び出すと、クラスのインスタンスが作成される
class hoge_class:  # クラスの定義
 ・・・
hoge_instance = hoge_class()



■ メソッド
class文に続いて、1段階インデントしたブロックにメソッドを記述する
メソッドは関数と同じように、defから始める
メソッドがない内容が空のクラスにはpassとだけ書いておく
関数定義と同じように、class文の直後にドキュメンテーション文字列を記述できる
class hoge_class:  # クラスの定義
 """
 ここにドキュメントを書く
 """
 def foo(self, AAA, BBB):
 """ プリントするだけ """
  print(self, AAA, BBB)

メソッドは必ず引数を1つ以上取る
最初の引数にはクラスのインスタンスを指定する

obj=hoge()
obj.foo("aaa", "bbb")
のように使う
selfの部分がないような気がするけど、まだよくわかっていない




■ 属性
クラスのインスタンスに属性値を割り当てたいときは、事前に定義の必要はない
オブジェクト obj に属性を設定する場合は、 .演算子で属性名を指定する
obj=hoge()
obj.bar = 100
# objの属性barに100を設定する

print( obj.bar )
# 参照するときも同様にする


del文で属性を削除できる
del obj.bar



■ __new__()メソッド、__init__() メソッド
obj = hoge()
のようにクラスオブジェクトを呼び出すと、まず __new__()メソッドが呼び出される
その後、__init__()メソッドが呼び出されて、インスタンスを初期化する
__init__()メソッドはコンストラクタとも呼ばれるメソッドで主にインスタンスの属性値の初期化処理をする

class hoge_class:  # クラスの定義
 """
 ここにドキュメントを書く
 """
 def __init__(self, AAA, BBB):
 """ 属性値の初期値を設定する"""
  self.AAA = AAA
  self.BBB = BBB

obj = hoge(AAA=1, BBB=2)
# hoge.__init__(1, 2) が呼び出される


__init__メソッドは返り値を返さない


他にも__del__()メソッドがある
これはもう使わないインスタンスを解放されるときに、呼び出される
インスタンスが管理していたリソースの開放を行うため

__del__()の使用は計画的に、と本には書いてある
使用はしないほうがいいらしい、メモリーリークの可能性が高まるとか



■ 継承
あるクラス Aを定義する
別のクラスBで クラスAを引数に取ると、クラスBの中でクラスAのメソッドを呼び出して使うことができる
このとき、super()を使う


■ 多重継承
クラスCとクラスDを宣言する
クラスEの引数にクラスCとDを取ると、クラスEの中でクラスCとDのメソッドが使える
このとき引数は
class hoge(C, D):
のようにカンマで区切る



■ プライベートメンバ
名前が__(アンダーバー2個以上)で始まり、かつ末尾に__が2個以上つかない場合はプライベートメンバになる
プライベートメンバの例
__hoge
__hoge_
プライベートメンバじゃない例
_hoge
__hoge__

プライベートメンバはクラスの中では参照できるが、クラスの外からは参照することができない





■ デコレータ
「関数を引数にとって、戻り値として関数を返す」関数をデコレータと呼ぶ
def print_deco(func):
 print(func)
 return func

def hoge():
 print("python is GOD")

ref_func = print_deco(hoge)

ref_func()
# これを実行すると "python is GOD" と表示される

関数を定義するdef文の直前に@記号をつけてデコレータ関数を指定ry

もしデコレータ(@記号)について詳しく知る必要ができたら以下に目を通してちょんまげ(未来の自分へ)
■ 参考 : Pythonのデコレータについて

デコレーターを利用することで、既存関数の処理の前後に自分自身で、処理を付け加えることができます
ということらしい


ちなみにデコレータは複数指定できる
@hoge1
@hoge2
@hoge3
def foo():
 pass


def foo():
 pass

AAA = hoge1( hoge2( hoge3( foo ) ))
と同じらしい







■ ファイル入出力

まぁ必要ならそのうち書く











一応、本自体は読み終わったので後はまとめるだけ




■ if
if 条件式 :
 条件式が真の場合の処理
elif 条件式 :
 条件式が真の場合の処理

どこがif文の終わりかはブロックで判断する必要がある


■ pass
passは何もする必要がないときに書く
pythonではブロックがないとエラーが出るときがあるため、代わりにpassと書いておく


■ while
while 条件式 :
 ・・・
else :
 ・・・

サンプルコード
stopって変数を使わなくてもいいんじゃないか?と思って2つめのを書いてみた
おそらく実行時に毎回wordの長さを評価するからすっごい長いリストの場合は計算時間が遅くなるとかそういうこと?
それとも1度計算した量はキャッシュされてるとか?
#!/usr/bin/env python
# -*- coding: utf-8 -*-

word="PYTHONisGOS"
stop=len(word)
i=0
while i < stop:
 print(word[i])
 i += 1


i=0
while i < len(word):
 print(word[i])
 i += 1



■ break
whileを使ったループで、そのブロックから抜け出すときに使う


■ else節
whileブロックの後にelse節があれば、ループ終了後に実行される
ただしbreakで中断した場合はelse節は実行されない
(使い所がわからぬ)


■ for
for 変数名 in イテラブルオブジェクト:

イテラブルオブジェクトはリスト、タプル、文字列などのこと
イテラブルオブジェクトの要素を前から取り出して、変数名に代入していく

上の例は一番簡単な例
下の例は、リストの中身がタプルな場合
それをi, jと分解して変数に代入することもできる。
今回はタプルなのでfor (i, j) inと書かなくても()を省略している
読みやすいコード的には()があった気がするけど、今読んでるコードではこういう()はない
#!/usr/bin/env python
# -*- coding: utf-8 -*-

list=[1,2,3,4,5]
for i in list:
print(i)

print("")

list2=[(1, 2), (3, 4), (5, 6)]
for i, j in list2:
print(i)
print(j)


else節はfor文でも使える
total=0
list=[1,2,3,4,5]
for i in list:
 print(i)
 total += i
else :
 print(total)



■ range
3種類の使い方ができる
range(stop)
range(start, stop)
range(start, stop, step)
これまで学んだことからすると、rangeの定義のときにデフォルト値が代入されているんだと思う
def range(start=1, stop, step=1)
か? いや、でもこれだとrange(10)ってしたときにstart=10になってしまうような・・・ まぁいいか

使用例
>>> range(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(5, -10, -1)
[5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9]


■ enumerate
イテラブルオブジェクトから取得した要素と、その要素のインデックス値をペアにしたタプルを返す
list=["a", "b", "c"]
for val_list, i in enumerate(list, 1):
print i, val_list





■ 例外処理

例外の送出は raise文で行う
>>> raise ValueError("hogehoge")
Traceback (most recent call last):
File "", line 1, in
ValueError: hogehoge


■ トレースバックオブジェクト
■ assert文
■ with文
飛ばす






■ 関数定義
def 関数名(引数1, 引数2, ・・・):

関数定義の中でimport文によるミュジュールのインポートをすると関数内だけ有効になる

関数の戻り値はreturn文で指定する
return文の戻り値を省略すると戻り値はNoneになる
return文自体を省略しても戻り値はNoneになる
passと関数定義の最後に書いても戻り値はNone


■ 可変長引数
引数の名前に*記号を付けた引数がある関数は任意の数の引数を取れる

def hoge(a, b, *c):
この場合、前からhoge(1, 2, 3, 4, 5)を実行すると
a=1
b=1
c=(3, 4, 5)
と代入される

他にも **cとかもできるらしいが、よくわからぬ。辞書と関係あるっぽい



■ キーワード専用引数

def hoge(*AAA, BBB):
とする
hoge(1, 2, 3)
では実行時にエラーが出る
hoge(1, 2, BBB=3)
のようにキーワードを必ず指定しないといけない

逆に
hoge(BBB=3)
でも動くはず



■ デフォルト引数
def hoge(x=1, y=2, z=3):
とすると、
hoge()
だけでも動く
hoge(100)
とすると、
x=100, y=2, z=3
が代入されてhogeが実行される





■ ドキュメンテーション文字列

関数定義の次に"""で囲まれた文章があると、それはドキュメンテーション文字列になる
def hoge(a, b, c):
 """ hogehoge
 a -- argument a
 b -- argument b
 c -- argument c
 """
みたいな感じ

関数オブジェクトの __doc__ 属性にこれらの文字列が代入されており、help(hoge)で表示できる







■ グローバル変数とローカル変数

モジュールの中で
hoge = 100

def func():
 foo = 200
となっているとhogeはグローバル変数
fooはローカル変数

グローバル変数はどの関数の中でも参照できるが、ローカルは関数内でのみ参照できる



■ import
これは前に書いた

あるモジュールから複数の関数をインポートする場合は
from math import (pi, math, pow, sin, cos, tan, sqrt)
のようにする

from math import *
とすると、math.pyの中にある__all__という名前のシーケンスがあればそこに書かれているオブジェクトのみインポートされる
__all__がない場合は名前の1文字目が_ではないオブジェクトがすべてインポートされる


■ モジュール検索パス

環境変数PYTHONPATHで設定する




■ パッケージ

パッケージはモジュールを格納するディレクトリで、複数のモジュールを階層的に管理する

ディレクトリに __init__.py という名前のファイルがあるディレクトリは、そのパッケージとしてインポートできる
パッケージ内のサブディレクトリに__init__,pyがあればサブパッケージとしてインポートできる
中身は空でOKらしい


import hoge   # hogeというパッケージをインポート
import hoge.foo # hogeパッケージの中のfooモジュールをインポートする
from hoge import AAA, BBB, CCC # hogeパッケージの中の一部のモジュールをインポートする


イマイチパッケージとモジュールの区別がついてないけど
おそらくモジュールを集めたものがパッケージなんやろうな

次の記事でクラスについてまとめて終わり〜










■ シーケンス
リスト、タプル、文字列、他にバイト型(これは全然知らない)をシーケンスと呼ぶ
どれも添え字やスライスを使って、同じように要素の操作を行える


■ 添字を使ったアクセス
>>> list=[1,2,3,4,5]
>>> list[2]
3
>>> list=[0,1,2,3,4,5]
>>> list[2]
2
>>> list[-2]
4
>>> list[-1]
5
前にも書いたとおり負のインデックスは、リストの後ろから順番に要素にアクセスできる


■ スライス

hoge[開始位置:終了位置]
という書き方で、リストの一部だけを取り出すことができる
存在しないスライスをしたとしても、エラーは出ずに空リストが返ってくる
>>> list=[0,1,2,3,4,5]
>>> list[0:2]
[0, 1]
>>> list[0:6]
[0, 1, 2, 3, 4, 5]
>>> list[-2:-5]
[]
>>> list[-5:-2]
[1, 2, 3]

hoge[開始位置:終了位置:増分値]
のように増分値を設定することで何個飛ばしでスライスすることもできる
(これは何かに使えるかもしれないので覚えとこ)
>>> list=[0,1,2,3,4,5]
>>> list[0:5:2]
[0, 2, 4]

↑のようなオブジェクトを作成するという方法もある
>>> list=[0,1,2,3,4,5]
>>> slice(0, 5,2)
slice(0, 5, 2)
>>> list[slice(0, 5,2)]
[0, 2, 4]


リストの一部の要素を修正するときは
>>> list=[0,1,2,3,4,5]
>>> list[0]=100
>>> list[5]=500
>>> list
[100, 1, 2, 3, 4, 500]

スライスを使って、複数の要素を一度に修正することもできる
指定するインデックスが2個で、代入する要素が3個と不一致でもなんとかゴリ押してくれるっぽい
>>> list=[0,1,2,3,4,5]
>>> list[2:4]=["A", "B", "C"]
>>> list
[0, 1, 'A', 'B', 'C', 4, 5]
>>> list[2:4]
['A', 'B']


要素の更新には += や *= も使える
>>> list=[0,1,2,3,4,5]
>>> list[2] += 4
>>> list
[0, 1, 6, 3, 4, 5]
>>> list[1] *= 1000
>>> list
[0, 1000, 6, 3, 4, 5]
数字同士に対して、これらの処理をするのはどうなるかわかるけど
文字列にも += や*=が使えるっぽい
そもそもリストに * を使うと、そのリストと同じものを2つ作るという点に注意、たぶんそのうち出てくる



要素の削除はdelを使う
>>> list=[0,1,2,3,4,5]
>>> del list[0], list[4]
>>> list
[1, 2, 3, 4]


■ +と*をリストに使ってみる
+はリスト同士をくっつける
*はリストをその後の数字の分だけ繰り返す
>>> [1,2,3] + [44, 55, 66]
[1, 2, 3, 44, 55, 66]
>>> [100, 111, 222] * 3
[100, 111, 222, 100, 111, 222, 100, 111, 222]
>>> [100, 111, 222] * 3.5
Traceback (most recent call last):
File "", line 1, in
TypeError: can't multiply sequence by non-int of type 'float'
*の後の数字は整数じゃないとエラーが出る



■ 比較演算子
<や>など
シーケンスの要素同士を先頭から比較して、TrueかFalseを返す
>>> [1, 2] < [3, 4]
True
>>> [1, 2] < [1, 4]
True
>>> [1, 2] < [1, 1]
False


■ メンバーシップ演算子
>>> 1 in [1,2,3,4,5]
True
>>> 0 in [1,2,3,4,5]
False
後々出てくる集合でも活躍する



■ シーケンスの長さ
組み込み関数のlen()を使う
>>> len([1,2,3,4,5])
5



■ リストに要素を追加する
リストのメソッドappend()を使う
>>> list=[0, 1, 2, 3, 4, 5]
>>> list.append(100)
>>> list
[0, 1, 2, 3, 4, 5, 100]


■ リスト内包式
Haskellでもあったリスト内包表記
たぶん使わんからパス



■ リストのメソッド簡易表

リストhogeの末尾にvalueを追加する
hoge.append(value)

リストhogeの要素をすべて削除する
hoge.clear()
del L[:]と同じ

python2だとエラーが出る
なんか間違ってる・・?
>>> L=[1,2,3,4]
>>> L.clear()
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'list' object has no attribute 'clear'

めんどくさくなったので、まとめられてるところを貼っとく
■ 参考 : Python リストのメソッド


リストの順序を逆に出来る
逆にしたリストを返すのではなくてリストhogeの中身を逆にしてしまう
hoge.reverse()


ソート
オプションがあるけど、まぁ使うときに調べるっしょ
hoge.sort()





■ タプル
基本的にリストとほとんど同じだけど、一番異なるところはタプルは更新不能なオブジェクト
>>> ta=(1,2,3)
>>> ta[1]
2
>>> ta[1]=4
Traceback (most recent call last):
File "", line 1, in
TypeError: 'tuple' object does not support item assignment
■ 参考 : Python のタプルとリストの違い、タプルの使いどころ


リストはミュータブルであり、タプルはイミュータブルである
= リストは要素を更新できるか、タプルは要素が更新できない
= タプルはオブジェクト id を変えずに要素を追加・変更・削除をすることができない





■ 文字列
複数行の文字列は\で分割できる
複数行の文字列は"""や'''で囲むと記述できる






■ 辞書オブジェクト
{キー:値, キー:値, キー:値}
という書き方をする
空の辞書は{}





■ 集合
{要素, 要素, 要素}
という書き方をする
集合の要素は重複しない、というのが特徴
つまり1という要素があったら、1という要素を追加しても集合は何も変わらない
>>> {1,2,3,4,5}
set([1, 2, 3, 4, 5])
>>> 1 in {1,2,3,4,5}
True
>>> "a" in {1,2,3,4,5}
False
>>> {1,2,3} <= {1,2,3,4}
True
>>> {1,2,3} < {1,2,3,4}
True
inや<などの演算子が使える
inは左の集合が右の集合に含まれたらTrue
<=はinと同じだと思う
<は少し違って、左の集合と右の集合が同じ場合はFalseになる、それ以外は<=と同じ

==は左と右の集合が完全に同じならTrue、それ以外はFalse

空集合を作るときは
set()


■ 集合のメソッド

集合に要素を追加する
hoge.add(elem)




(まぁ書かなくてもええやろ・・・)







■ 他のデータ型からリスト型への変換

■ 参考 : Python3系の基礎文法(リスト、タプル)
>>> ta=(1,2,3, "b", 4)
>>> list(ta)
[1, 2, 3, 'b', 4]

>>> ch1="ABCDEF"
>>> list(ch1)
['A', 'B', 'C', 'D', 'E', 'F']

>>> ch2="2018/04/10"
>>> ch2.split("/")
['2018', '04', '10']












本自体はトイレでさっくさく読み進めてるけど、まとめる作業がかなり遅れてる・・・
何かを学んだらアウトプットしないと、定着しない!
というのが建前で、ここに書いとけばあとで検索できるし便利だから書いてるだけですはい




今日は関数から始めます

■ 関数

関数定義はdefを使う
文末に:をつけることを忘れずに
その後はブロック終わりまですべて同じようにインデントする

例:
def average(a, b, c):
 return (a+b+c)/3.0
#!/usr/bin/env python
# -*- coding: utf-8 -*-

def average(a, b, c):
print b
return (a+b+c)/3.0

print( average(1, 2, 3) )
print( average(b=1, a=2, c=5) )
関数の引数は前からa, b, cと代入する以外にも
どの引数に代入するかを指定することもできる


また引数のデフォルト値を指定してくこともできる
この場合は、average(1)のように、引数b, cを指定しないとデフォルト値であるb=10, c=30が使用される
なので、defされている引数の数と関数に代入する引数の数が違っていても驚かないこと(私は面食らいました)
def average2(a=10, b=10, c=30):
print b
return (a+b+c)/3.0

print( average2(1) )





■ クラス

これが全然わからん
あとで詳しくやると思うので一度飛ばす






■ モジュール

外部ライブラリのことをモジュールと呼ぶ
pythonだとscipy, numpyあたりは非常によく使われる

ちゃんとインストールして、PYTHONPATHを通していれば
import numpy
で使えるようになるはず
他にも
from numpy import *
from numpy import 関数名
とかもOK
1つめの書き方はnumpyに入っているすべての関数を使えるようにする
2つめの書き方は複数のモジュールに同じ名前の関数が入っているときに、使いたくない関数をあえてimportしないための書き方
モジュールにあるすべての関数を把握していないなら、2つめの書き方のほうが安全






■ 入出力

input()でターミナルの文字入力を受け付けられる
たぶん使わん





■ オブジェクト

オブジェクトにはメソッドと属性がある
spam.ham
で、spamオブジェクトのham属性を参照する

spam.ham="Egg"
で、spamオブジェクトのham属性を設定する

属性を消すときは
del spam.ham

また、メソッドも同様に.で指定する
オブジェクト.メソッド名(引数1, 引数2, ...)

objectの属性nameに値valueを設定するとき
setattr(object, name, value)

objectの属性nameを削除するとき
delattr(object, name)

objectの属性nameを取得するとき、
getattr(object, name, default_value)

objectの属性nameがあるときはTrueを返す
hasattr(object, name, value)




Noneは値が指定されていないときに使われる値
C言語でいうところのNULL

NoneはNoneType型のシングルトンオブジェクト
シングルトンは属性が1つしかないオブジェクトのこと(だったはず)

Noneのようなシングルトンオブジェクトかどうかのチェックには
 spam == None
という書き方ではなくて、
 spam is Nan
と同一性をチェックするis または is not演算子を使う
==よりも高速で動作するし、==演算子は比較対象のオブジェクトを独自に実装できるので正しい判定になるとは限らないから(よくわからん)





■ 関数呼び出し

hoge(1, 2, 3, 4, 5)
のような関数があったとして、引数を毎回5つ手で入力するのがめんどくさい
そういうときは
args = [1, 2, 3, 4, 5]
という配列を用意しておいて
hoge(*args)
と書けば、argsというリストを展開して、実行される
つまり
hoge(1, 2, 3, 4, 5)
を実行するのと同じことになる

**args
のような書き方もできるが、これはargsが辞書のとき? よくわからん






■ 代入
>>> a=100
>>> b=200
>>> c=a+b
>>> c
300
>>> a=b=c=500
>>> a,b,c
(500, 500, 500)

a=b=c=500のように、すべて=で連結することもできる
最後のa,b,cは実はタプルの書き方なので画面には(500, 500, 500)と表示されている
そのうち出てくる



■ リストの参照

hogeというリストを作成する
fooというリストはhogeと同じ値を参照するように設定する
リストhogeにappendというメソッドを使って、4番目の要素を追加する
そうすると、リストfooにもその要素が追加されている
>>> hoge=[1, 2, 3]
>>> foo=hoge
>>> foo
[1, 2, 3]
>>> hoge.append("FOOOOOOO")
>>> hoge
[1, 2, 3, 'FOOOOOOO']
>>> foo
[1, 2, 3, 'FOOOOOOO']


>>> foo.append("New")
>>> foo
[1, 2, 3, 'FOOOOOOO', 'New']
>>> hoge
[1, 2, 3, 'FOOOOOOO', 'New']

最後に5番目の要素をリストfooに追加してみる
この場合もリストhogeに追加されている(これは予想外の結果でビビった、fooからhogeへの一方通行だと思っていたので)
リストfooはリストhogeを参照している、というよりも、リストfooはリストhogeのメモリアドレスを参照しているということか?




■ 要素の分解

hogeというリストの各成分を左辺に要素数の分だけ代入先を書くと分解できる
>>> hoge=[1, 2, 3]
>>> first, second, third = hoge
>>> first
1
>>> second
2
>>> third
3


左辺に変数が3つ、右辺に要素が4つあるリストがあったとすると、
a, b, *c = [1, 2, 3, 4]
このとき、余った4はcに代入されてc=[3, 4]と同じことになると本には書いてあるけど
python2ではこの機能はないっぽい
手元にpython3がないからチェックできないが〜



■ del
del a
del a, b, c
で変数の削除ができる


■ ビット演算子

ひとまず使わんやろうからスキップ


■ 変数名

OK
・アンダーラインとアルファベット、数字を使った名前

NG
・記号が使われている
・数字から始まる

python3からはひらがな、漢字などが使えるようになったらしいけどまぁ使わんわな・・・




■ 論理演算子
X or Y  # XとYの論理和
X and Y # XとYの論理積
not X  # Xの否定


真偽値はTrueとFalse以外、偽の値としては
None
数値の0や0.や0+0j
空文字列""や''
空のリスト、空の辞書や空のタプル
も偽として扱われる



■ ショートサーキット

a = b or c or d or e or f
という式があったとして、これは先頭の真の値がaに代入される
もしcが真の値(偽以外)なら、それより右にあるd, e, fは評価されない
これをショートサーキットと呼ぶ




■ 比較演算子
<
<=
>
>=
==
!=
is
is not
in
not in


x==y はxとyが等しいかどうか判定する
このとき型変換が行われる可能性がある
例えば
>>> 1==1.0
True
>>> 2==2+0j
True


isやis notであれば同じオブジェクトであるかどうかを評価する
>>> 1 is 1.0
False
>>> 2 is 2+0j
False



C言語にはない便利そうな特徴
2つ"以上の"比較演算子を連結できる(これもショートサーキットされる可能性がある)
>>> a = 3
>>> 1 < a and a < 5
True
>>> 1 < a < 5
True




■ 三項演算子, 条件演算子

a if b else c
条件bの値が真ならaが値となり、偽ならcの値となる
>>> x=1
>>> 100 if x==1 else 200
100
>>> x=2
>>> 100 if x==1 else 200
200



■ 自動的な型変換

1 + 2.0
のように異なる数値型の計算をすると、自動的に型変換が起こる

・どちらかの値が複素数なら複素数に変換される
・どちらかの値が浮動小数点なら浮動小数点に変換される



■ その他の演算子

絶対値を計算する
abs(a)

divmod(x, y)
xをyで割り算したときの商とあまりをタプルで返す
例:
>>> divmod(20, 6)
(3, 2)


pow(a, b)
a**bを計算する


real
imag
数値の実部(虚部)を返す
虚部を持たない整数型などの場合は常に0を返す

conjugate()
数値の複素共役を返す



■ 整数値リテラル

10進法 : 0または0以外から始まる数字
2進法 : 0bまたは0Bから始まる0か1の文字列
8進法 : 0oまたは0Oから始まる0から7の文字列
16進法 :0xまたは0Xから始まる0から9+aからfまたはAからFまでの文字列


int()
浮動小数点とかを整数に変換する
int()は0を返す


■ 整数値のビット操作

しばらく使うことはないと思うので飛ばす
使うことになったら、また別記事で書く



■ 浮動小数点

float()
浮動小数点型に変換する
float()は0.0を返す



■ infとnan
浮動小数点の値が有効な範囲より大きいとinfという文字列になる
>>> 1e+200*1e+200
inf


または非数(Not A Number; Nan)という値になる場合もある
>>> 0 * 1e1000
nan

また、infとnanはfloatを使って作成できる
>>> float("INF")
inf
>>> float("NAN")
nan
>>> float("nan")
nan
>>> float("inf")
inf




■ 複素数

1+2.0j
とかjまたはJがついてると複素数

複素数オブジェクトはcomplex型



complex(real, imag)
で、複素数を作成できる
>>> complex()
0j
>>> complex(1, 200)
(1+200j)
>>> complex("3+4j")
(3+4j)





かなり長かった・・・











参加者 1名
本読んでるメモです




pythonの特徴
・読みやすい
 コードが英語のようにスラスラと読めるようになってる

・シンプル
 他の言語だとある処理をするための方法が複数あるが、pythonではできるだけ一貫性のある方法で処理を行うようになってる

・高レベル言語
 メモリの取得・開放が自動化されている

・標準ライブラリやドキュメントが豊富

・マルチプラットフォーム
 windows, linux, macなど

・拡張と組み込み
 組み込みとは、起動したら標準的に使える機能のこと
 pythonから呼び出せる形式のライブラリは拡張モジュールと呼ぶ
 拡張モジュールを使っていろいろなライブラリやアプリケーションを組み合わせて使うことが得意な言語をGlue言語と呼ぶ


pythonに出てくる名前はイギリスの「Monty Python's Flying Circus」という番組から取られて付けられていることが多い
例えば、spam, ham, eggとか
ただ最近ではその習慣も少し薄れてきてる


■ pythonの処理系

・Python
 オリジナルのC言語で実装されたpython
・PyPy
・Jython
 Javaで実装されたpython
・IronPython
・Stackless Python
 CPythonから派生したもの
 高速な並列計算が出来る
・Cython
 Pythonの拡張モジュールを開発するための専用言語
 文法はpythonと似ていて、拡張モジュールのソースコードをC/C++言語で生成する







■ スクリプトファイルの実行
$ python hoge.py

■ スクリプトファイルの中身
#!/usr/bin/env python の行はShebang(シバン)行と呼ばれる
#!/opt/local/bin/python と直接指定してもOK
#!/usr/bin/env python
print('hello world')

シェルスクリプトと同じように
$ chmod +x hoge.py
で実行権限を与えることで
$ hoge.py
で実行することもできる


■ 文字コード
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print('hello world')
と書いておく
codingのcは小文字にする

# coding=utf-8
と=にしてもOK



# がコメントアウト
複数行のコメントアウトは
#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''







'''

"""







"""のように'か"を3つ重ねればOK


■ インデントによるブロック
ご存知のようにpythonやHaskellではインデントによって、ブロックを表す

読んでる本にはインデントはタブではなくて、スペース4個で表わすのがpython標準と書いてある


■ データ型
100 # 整数
100.0 # 浮動小数点

0b100 # 2進法で4
0o100 # 8進法で64
0x100 #16進法で256

論理値型
100 > 99 # これはTrue
100 < 99 # これはFalse

文字列オブジェクトは1度作成したら後から変更できない
'か"で囲む
'spam'
"ham"


■ 演算子
標準的な演算子が使える
x + y
x - y
x * y
x / y    # xとyの除算
x // y    # xとyの整数除算 => なんだこれ?
x % y    # x/yをしたときの余り
-x      # xの符号を反転したもの
+x      # xの符号をそのままにしたもの
x ** y    # xのy乗



python2とpython3で大きく違うのが除算のやり方
整数/整数のときに、整数で返すのがpython2
>>> 10/3
3
だけど
整数/整数のときに、python3では小数で返す
>>> 10/3
3.33333333

整数除算は、整数同士の除算をそのままして、整数で結果を返す
python2では
>>> 10//3
3
python3では
>>> 10//3
3


■ 比較演算子
x < y
x > y
x <= y
x >= y
x == y
x != y
x is y     # これと==は厳密には違うらしい
x is not y
x in y
x not in y

pythonでは
if (0 < spam) and (spam < 100):

if 0 < spam < 100
と書ける(便利)






■ 辞書オブジェクト
{キー:値, キー:値}
という書き方
>>> dic={1:'one', 2:'two'}
>>> dic[0]
Traceback (most recent call last):
File "", line 1, in
KeyError: 0
>>> dic[1]
'one'
>>> dic[2]
'two'
キーにないものを入れるとエラーが出る
おそらくキーは数字じゃないとダメ?


辞書の値は変更できる
>>> dic[2]='ni'
>>> dic[2]
'ni'
delを使えば、辞書のキーは削除できる
>>> del dic[2]
>>> dic[2]
Traceback (most recent call last):
File "", line 1, in
KeyError: 2



■ リストオブジェクト
[要素1, 要素2, ・・・]
という書き方
>>> List1=[1, 2, 3]
>>> List2=[]
>>> List3=[1, "two", "san", [4, 5, 6]]
>>> List1
[1, 2, 3]
>>> List2
[]
>>> List3
[1, 'two', 'san', [4, 5, 6]]


■ タプルオブジェクト
(要素1, 要素2, ・・・)
という書き方
この括弧()は可読性を上げるために付けているだけで、必須ではないらしい

ただし、空タプルは
()
としないとダメ
>>> Tuple1=()
>>> Tuple2=(1, 2, 3)
>>> Tuple3=(1, "ni", [3,4])

今のところ、リストとタプルの違いがわからん・・・
Haskellだと、リストは1つのデータ型の要素しか持てないけどタプルだといろんなデータ型の要素を持てるって違いがあった気がするけど
pythonはリストもタプルもいろんなデータ型のをごっちゃに持てるっぽいなぁ



■ シーケンスのアクセス
文字列、リスト、タプルなどの配列はシーケンスと呼ばれる
これらの種類のオブジェクトは要素にアクセスする方法は同じ
[]の中に整数を入れて指定する
>>> seek="python_is_GOD"
>>> seek[1]
'y'
>>> seek[0]
'p'
>>> seek="python_is_GOD"
>>> seek[0]
'p'
>>> seek[1]
'y'
>>> seek[100]
Traceback (most recent call last):
File "", line 1, in
IndexError: string index out of range
>>> seek[-1]
'D'
>>> seek[-100]
Traceback (most recent call last):
File "", line 1, in
IndexError: string index out of range
>>> seek[-10]
'h'
インデックスは0から始まる
リストのサイズを超えてアクセスするとエラーが出る

負のインデックスを指定すると、例えば-1の場合はリストの後ろから1番目とかになる
同じくリストのサイズを超えて負の数字を書くとエラーが出る



セミコロン : を使うと、範囲指定ができる
[0:6]で0から6番目までを指定できる
[7:]で7番目から終わりまで
[7:1]と順番を変にすると空の文字列が返ってくる
>>> seek="python_is_GOD"
>>> seek[0:6]
'python'
>>> seek[7:]
'is_GOD'
>>> seek[7:1]
''

リストの要素を変更するには
>>> L=[1,2,3,4,5]
>>> L[0]="123"
>>> L
['123', 2, 3, 4, 5]







■ if, elif, else文
インデントをここでは打てないので、全角スペースで代用してます
(コピペしても動かないよ)
$ cat hoge.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

age = 18
sex = "female"
boy = girl = other = 0

if age < 20:
 if sex == "male":
  boy += 1
 elif sex == "female":
  girl += 1
 else:
  other += 1

print(boy, girl, other)


$ hoge.py
(0, 1, 0)







■ ループ
while 条件式 :

for 変数名 in 式 :
という2つの書き方がある。
シェルスクリプトに似てるから覚えやすい、最後のセミコロンを忘れる気がする
#!/usr/bin/env python
# -*- coding: utf-8 -*-

list1="python_is_GOD"
stop=len(list1)
i=0
while i < stop:
 print(list1[i])
 i += 1

for j in list1:
 print(j)

リスト、タプル、辞書などはイテラブルなオブジェクトと呼ばれる
イテレーターってのもあるらしい
これによって、1つ前のコードのようなfor文が書ける







いろんな記事を見てみると、特別なことをしなくてもlabelにtex表記が使えるように書いてある

けどなんでか手元ではうまくいかない・・・

matplotlib以外に3次元プロットをするためのmpl_toolkitsも使ってるっぽいけど、
それは原因ではなさそう
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot

「mpl_toolkits tex label」とか「mpl_toolkits greek label」とかで調べていくと、

■ 参考 : Text rendering With LaTeX

のtex_demo.py にヒントがあった

"""
Demo of TeX rendering.

You can use TeX to render all of your matplotlib text if the rc
parameter text.usetex is set. This works currently on the agg and ps
backends, and requires that you have tex and the other dependencies
described at http://matplotlib.org/users/usetex.html
properly installed on your system. The first time you run a script
you will see a lot of output from tex and associated tools. The next
time, the run may be silent, as a lot of the information is cached in
~/.tex.cache

"""
import numpy as np
import matplotlib.pyplot as plt


# Example data
t = np.arange(0.0, 1.0 + 0.01, 0.01)
s = np.cos(4 * np.pi * t) + 2

plt.rc('text', usetex=True)
plt.rc('font', family='serif')
plt.plot(t, s)

plt.xlabel(r'\textbf{time} (s)')
plt.ylabel(r'\textit{voltage} (mV)',fontsize=16)
plt.title(r"\TeX\ is Number "
r"$\displaystyle\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}$!",
fontsize=16, color='gray')
# Make room for the ridiculously large title.
plt.subplots_adjust(top=0.8)

plt.savefig('tex_demo')
plt.show()


赤色にした2行が大切
手元でテストしたらfontの方はなくてもきちんとTeX表記になったけど、
plt.rc('text', usetex=True)
を消すと、TeX表記が崩れて変なことになった
こっちが重要っぽい


ここにも似たようなことが書かれている↓

■ 参考 : Typing Greek letters etc. in Python plots




matplotlibで使えるTeX記号関連一覧↓

■ 参考 : Writing mathematical expressions







■ 参考 : Python Tips:ライブラリ・モジュールの場所を調べたい

■ 参考 : Pythonのimportについてまとめる


これらの記事によるとPYTHONPATHという環境変数を使ってPATHを通せばいい
pythonでは__init__.pyを含むディレクトリをパッケージという
同じディレクトリに [パッケージ名].py というファイルもあるはず
このディレクトリの絶対PATHをかけばいい↓ (ここではhogeってパッケージをインストールしたとして)
setenv PYTHONPATH ${HOME}/local/lib64/python2.7/site-packages/hoge

lib64かどうかは環境によるので、まずはこのパッケージがどこにあるかを探さないといけない








別にpythonを使いたいわけではないんです・・・・
とあるライブラリが使いたいので、それに必要なライブラリをソースからインストールしたい。

最初に今回やった解決方法を書いときます
configureにオプションをつけて、中で使われてる変数を強制的に上書きして事なきを得ました
./configure PYTHON_EXTRA_LIBS='-u _PyMac_Error /opt/local/Library/Frameworks/Python.framework/Versions/2.7/Python"
なので、この記事の途中でやってる
Systemファイルの書き換えとかは実はやらなくてもいいっていう・・・
まぁSIPとか知らなかったし、いいきっかけやったか(涙)



出発点として、
./configure --prefix=$HOME/local
としてみるが途中でエラーが出て止まる

エラーは
checking for a Python interpreter with version >= "2.7"... python
checking for python... /opt/local/bin/python
checking for python version... 2.7
checking for python platform... darwin
checking for python script directory... ${prefix}/lib/python2.7/site-packages
checking for python extension module directory... ${exec_prefix}/lib/python2.7/site-packages
checking for python2.7... (cached) /opt/local/bin/python
checking for a version of Python >= '2.1.0'... yes
checking for the distutils Python package... yes
checking for Python include path... -I/opt/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7
checking for Python library path... -L/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib -lpython2.7
checking for Python site-packages path... /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sit
e-packages
checking python extra libraries... -ldl -framework CoreFoundation
checking python extra linking flags... -u _PyMac_Error Python.framework/Versions/2.7/Python
checking consistency of all components of python development environment... no
configure: error: in `/Users/hoge/local/src/hoge:
configure: error:
Could not link test program to Python. Maybe the main Python library has been
installed in some non-standard library path. If so, pass it to configure,
via the LIBS environment variable.
Example: ./configure LIBS="-L/usr/non-standard-path/python/lib"
============================================================================
ERROR!
You probably have to install the development version of the Python package
for your distribution. The exact name of this package varies among them.
============================================================================

See `config.log' for more details
python関連のエラーっぽい
ご存知のようにappleがデフォルトで用意しているpythonは色々と問題を抱えていて
これをそのまま使っているとpython関連のライブラリと不整合が起きてきちんと動かない(インストールできないらしい)
理由は詳しくないのでわからないけど、昔一度ハマったことがある



この問題に関してはすでにmac portの方で対策済みで
mac portで例えばnumpyをインストールすると最後にメッセージとして
python27 has the following notes:
To make this the default Python or Python 2 (i.e., the version run by the 'python' or 'python2' commands), run one or both of:
% sudo port select --set python python27
% sudo port select --set python2 python27
みたいなのが表示される

なので、その通りにやっておくとpythonのデフォルトがmac portでインストールしたものになるのでOK


エラーに戻って、config.logに詳細が書いてあるらしいので見てみる
configure:17112: checking for python
configure:17130: found /opt/local/bin/python
configure:17142: result: /opt/local/bin/python
configure:17160: checking for python version
configure:17167: result: 2.7
configure:17179: checking for python platform
configure:17186: result: darwin
configure:17212: checking for python script directory
configure:17247: result: ${prefix}/lib/python2.7/site-packages
configure:17256: checking for python extension module directory
configure:17291: result: ${exec_prefix}/lib/python2.7/site-packages
configure:17312: checking for python2.7
configure:17342: result: /opt/local/bin/python
configure:17358: checking for a version of Python >= '2.1.0'
configure:17384: result: yes
configure:17415: checking for the distutils Python package
configure:17419: result: yes
configure:17433: checking for Python include path
configure:17449: result: -I/opt/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7
configure:17456: checking for Python library path
configure:17533: result: -L/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib -lpython2.7
configure:17540: checking for Python site-packages path
configure:17546: result: /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages
configure:17553: checking python extra libraries
configure:17560: result: -ldl -framework CoreFoundation
configure:17567: checking python extra linking flags
configure:17574: result: -u _PyMac_Error Python.framework/Versions/2.7/Python
configure:17581: checking consistency of all components of python development environment
configure:17609: gcc -o conftest -I/usr/local/include -I/opt/local/Library/Frameworks/Python.framework/Versions/2\
.7/include/python2.7 -L/usr/local/lib -ldl -framework CoreFoundation conftest.c -L/opt/local/Library/Frameworks\
/Python.framework/Versions/2.7/lib -lpython2.7 -u _PyMac_Error Python.framework/Versions/2.7/Python -u _PyMac_Erro\
r Python.framework/Versions/2.7/Python >&5
clang: error: no such file or directory: 'Python.framework/Versions/2.7/Python'
clang: error: no such file or directory: 'Python.framework/Versions/2.7/Python'
configure:17609: $? = 1
configure: failed program was:
| /* confdefs.h */
| // 一部消しました
| #define VERSION "1.4.1"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
| #define HAVE_STDLIB_H 1
| #define HAVE_STRING_H 1
| #define HAVE_MEMORY_H 1
| #define HAVE_STRINGS_H 1
| #define HAVE_INTTYPES_H 1
| #define HAVE_STDINT_H 1
| #define HAVE_UNISTD_H 1
| #define HAVE_DLFCN_H 1
| #define LT_OBJDIR ".libs/"
| #define HAVE_PYTHON "2.7"
| /* end confdefs.h. */
|
| #include <python.h>
| int
| main ()
| {
| Py_Initialize();
| ;
| return 0;
| }
|
configure:17627: result: no
configure:17631: error: in `/Users/hoge/local/src/hoge':
configure:17633: error:
Could not link test program to Python. Maybe the main Python library has been
installed in some non-standard library path. If so, pass it to configure,
via the LIBS environment variable.
Example: ./configure LIBS="-L/usr/non-standard-path/python/lib"
============================================================================
ERROR!
You probably have to install the development version of the Python package
for your distribution. The exact name of this package varies among them.
============================================================================

See `config.log' for more details
パッと見た感じでは
pythonに関連したライブラリのPATHなどをチェックして、最後にサンプルプログラムをコンパイルして
このまま先に進んでもいいかどうかチェックしてるように見える

このうち、赤で書いた部分
clang: error: no such file or directory: 'Python.framework/Versions/2.7/Python'
clang: error: no such file or directory: 'Python.framework/Versions/2.7/Python'
でエラーが起きてる
おそらくこれのせいでgcc ~~~~の部分がコケてるんだろう

pythonのことは本当に詳しくないので
/* confdefs.h */
// 一部消しました
#define VERSION "1.4.1"
#define STDC_HEADERS 1
#define HAVE_SYS_TYPES_H 1
#define HAVE_SYS_STAT_H 1
#define HAVE_STDLIB_H 1
#define HAVE_STRING_H 1
#define HAVE_MEMORY_H 1
#define HAVE_STRINGS_H 1
#define HAVE_INTTYPES_H 1
#define HAVE_STDINT_H 1
#define HAVE_UNISTD_H 1
#define HAVE_DLFCN_H 1
#define LT_OBJDIR ".libs/"
#define HAVE_PYTHON "2.7"
/* end confdefs.h. */

#include <python.h>
int
main ()
{
Py_Initialize();
;
return 0;
}
と同じサンプルコードを作ってgcc~~~~と同じコンパイルオプションでコンパイルしてみたが
同様のエラーが出た

Python.framework/Versions/2.7/Python
がないとエラーが出てるんだから、これがないのが問題なんだろうと思ってあれこれ調べたみた

正しくはこの前にprefixで何かつけば問題ないっぽい
実際、
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/Python
というのはある




いっろいろとググってたら、参考になるページを見つけた
最初に2つめの記事を見つけて、どうすればいいか書いてあったけど最初は理解できなかった
1つめの記事のあんちゃんの説明がとてもわかりやすかった

■ 参考 : Error occurred while installing sphinxbase

■ 参考 : Vim failing to compile with python on OS X


これらの記事では、自分とは全然違うライブラリか何かをMacの上でコンパイルしようとしてるけど遭遇してるエラーは同じ


大阪弁で意訳すると
config.logに
clang: error: no such file or directory: 'Python.framework/Versions/2.7/Python'
ってあるやん? これが原因やわ
■ 参考 : Vim failing to compile with python on OS X
にも書いてあるわ

-u _PyMac_Error /System/Library/Frameworks/Python.framework/Versions/2.7/Python
が正しいリンクで
-u _PyMac_Error Python.framework/Versions/2.7/Python
はパチモンやから気ぃつけや
で、示されてた記事の方をもう一度見ると、その正しい方のリンクに変更する方法が載ってた
これも関西弁で意訳すると
/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config
ってあるやん? いや、もしかしたらオタクんところは少しPATHが違うかもしれんけどそこは気にせんといて
こんなかに PyMac_Error ってのがあるはずやから探して
あった?
その変数って LINKFORSHARED として定義されてない?
せやろせやろ

ほんでな、この中に PYTHONFRAMEWORKDIR って変数が別にあるんちゃう?
これを PYTHONFRAMEWORKINSTALLDIR に修正するんや

あと
/Library/Frameworks/Python.framework/Versions/2.7
/Library/Frameworks/Python.framework/Versions/Current
/System/Library/Frameworks/Python.framework/Versions/2.7
/System/Library/Frameworks/Python.framework/Versions/Current
これらのディレクトリにあるPythonっていうシンボリックリンクを削除して、
mac portでインストールした正しいpythonにリンクを貼り直すんや
ほんまなんでこんなにpythonへのリンクがいっぱいあるのか謎やわ

そしたらぜーんぶまるっとうまくいくはずや
実際、この人の言う通り、自分の環境でも
LINKFORSHARED= -u _PyMac_Error $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)
ってのがありましたわ


自分的にはこの右の項目を全部消して空白にしてしまえばいいんちゃうかと思ったけど、
PYTHONFRAMEWORKDIR って変数の名前を PYTHONFRAMEWORKINSTALLDIR に置き換えろ、と書いてあるからそうした方がいいんやろな・・・







ここで、新たな問題が発生した
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config/Makefile
が修正できません・・・・
sudo emacs /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config/Makefile
ってやってもむりぽ・・・・


ググった感じでは
El Capitanの頃(Mac OSX 10.11)の頃に修正が入ってSystem Integrity Protecton(SIP) というのが追加された
これによって
/usr とか /System とか /Applicationの一部(Finderとかメール.appとかデフォルトで入ってるアプリ)とかが修正できなくなった
rootlessにするための修正らしい
それ以上は聞かないでくださいわかりません

■ 参考 : Mac のシステム整合性保護について



# この記事とは関係ないけど実は別のところでこのSIPに遭遇してたのを思い出したわw
# また後日別の記事に書くけど、Dockに置いているアプリのアイコンを好みのに置き換えたりしてて
# そのときにFinder、プレビューとかメールとかデフォルトで入ってるものは置き換えられなかったんすよ
# ググった感じではこのSIPに関係してるということはわかって
# そのときは、まぁジョブズの意思を尊重してやるか・・・とそのままにしてた
# 置き換えられるのは色々と変更した



で、このSIPモードの解決方法は

■ 参考 : Mac OS Sierra(10.12)以降のOSでSIPを無効にする方法(非常に簡単でした)

■ 参考 : SIPをもっと深く知ってみよう! 〜SIPは一体何を保護しているのか〜

1つめの記事がとても簡潔に必要なことだけまとめられてる
1. Macをリカバリーモードで起動する(command+rを押しっぱなしで起動する)
2. terminalを起動して、 csrutil disable とコマンドを入力する
3. Macが再起動したらSIPが無効化できてる

逆に有効にするときは同じ手順で csrutil enable と打てばOK


2つ目の記事には csrutilコマンドのオプションとかについてまとめられてる






という感じでSIPを解除してきました
python関連のエラーメッセージ解決に戻ります

sudo emacs /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config/Makefile
を修正する
PYTHONFRAMEWORKDIR って変数の名前
PYTHONFRAMEWORKINSTALLDIR
に置き換える


あと、シンボリックリンクを貼り直す

sudo rm /System/Library/Frameworks/Python.framework/Versions/Current/Python
sudo ln -s /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /System/Library/Frameworks/Python.framework/Versions/Current/Python

(2018/01/31 追記)
↑取り消し線で書いたことはおそらくやらないほうがいい
これをやってappleのpythonのPATHがわからなくなって環境を元に戻せなくなってしまった大馬鹿者がいるのでw

■ 参考 : 【Mac】gcc: error: unable to find utility "gcc", not a developer tool or in PATH というエラーが出た





このあとconfigureしたけどダメ・・・・
システム関連なので、再起動してからもう一度やってみたけどダメ




別の記事を見つけた

■ 参考 : Python Plugins: configure error on OSX #752

./configureのオプションに
PYTHON_FRAMEWORK=/Another/Directory/Library/Frameworks/Python.framework
を付け足すと
今回の場合はmac portでインストールしたものなので
PYTHON_FRAMEWORK="/opt/local/Library/Frameworks/Python.framework"


=> エラー変わらず・・・





そもそもの問題として、
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config/Makefile
を修正しても、全然./configureの結果に反映されていない気がする

こっちをなんとかしないといけない

もう一度先ほどの記事に戻ってみると、

./configure PYTHON_EXTRA_LDFLAGS="-u _PyMac_Error /Library/Frameworks/Python.framework/Versions/2.7/Python"
のが簡単な解決方法じゃないか?って言ってる人がいる
要するに、configureするときの変数をこれで上書きすると・・・ 頭よす
ただ自分の場合は
自分の場合は、
PYTHON_EXTRA_LDFLAGS='-ldl -framework CoreFoundation '
と特におかしなところはなくて、逆に
checking python extra linking flags
のところの変数がおかしい
それに対応した変数オプションを調べる必要がある


変数名とそのときの名前は、失敗したときの config.log の下のほうに「Output variables.」として一覧になっている
この中を見てみるとどうやら PYTHON_EXTRA_LDFLAGS と PYTHON_EXTRA_LIBS を上書きすればいいっぽい

ということで
./configure PYTHON_EXTRA_LIBS="-u _PyMac_Error /System/Library/Frameworks/Python.framework/Versions/2.7/Python"
で走らせてみると
ついに2日間見続けたエラーメッセージとは異なるエラーになった〜〜〜
configure:13689: checking python extra libraries
configure:13696: result: -u _PyMac_Error /System/Library/Frameworks/Python.framework/Versions/2.7/Python
configure:13703: checking python extra linking flags
configure:13710: result: -u _PyMac_Error /System/Library/Frameworks/Python.framework/Versions/2.7/Python
configure:13717: checking consistency of all components of python development environment
configure:13745: gcc -o conftest -I/usr/local/include -I/opt/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -L/usr/local/lib -u _PyMac_Error /System/Library/Frameworks/Python.framework/Versions/2.7/Python conftest.c -L/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib -lpython2.7 -u _PyMac_Error /System/Library/Frameworks/Python.framework/Versions/2.7/Python -u _PyMac_Error /System/Library/Frameworks/Python.framework/Versions/2.7/Python >&5
ld: can't link with a main executable file '/System/Library/Frameworks/Python.framework/Versions/2.7/Python' for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
configure:13745: $? = 1
configure: failed program was:


このあと1時間くらいあれこれやってみて、そもそも/System以下に入ってるデフォルトのpythonにする必要ないよな? とはたと気付く・・・
それで次のconfigureオプションに変更する
./configure PYTHON_EXTRA_LIBS='-u _PyMac_Error /opt/local/Library/Frameworks/Python.framework/Versions/2.7/Python"

この結果、
configure:13717: checking consistency of all components of python development environment
configure:13745: gcc -o conftest -I/usr/local/include -I/opt/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -L/usr/local/lib -ldl -framework CoreFoundation conftest.c -L/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib -lpython2.7 -u _PyMac_Error /opt/local/Library/Frameworks/Python.framework/Versions/2.7/Python -u _PyMac_Error /opt/local/Library/Frameworks/Python.framework/Versions/2.7/Python >&5
configure:13745: $? = 0
configure:13763: result: yes
これで、一応タイトルのpython関連のトラブルは全部潰せた・・・・・・・

長かった・・・・・・・・・・・・


ただ、この後別のエラーが出て configure は止まったw
そっちはまだわかりそうなエラーだったからいけそう







port select --list python
で一覧が表示される
Available versions for python:
 none
 python25-apple
 python26-apple
 python27 (active)
 python27-apple
これを変更したいときは
sudo port select --set python python27
てな感じにすればよいらしい

フーン。

(またpythonさんのお世話になる日が来てしまったか・・・)



■ このblogの他のportに関する記事

【Mac】Mac Portsを使ってみる

【python】Mac 10.6.8にscipy, numpy, pyplotlibをMac portを使ってインストールする










■参考
os.path - 共通のパス名操作

色々と便利な関数がありますね
前回、スノレパにpython回りの環境を作ろうとして、
mac portでpython2.7をインストールした

しかし、pythonを起動すると思っているversionとは違うのが起動してしまう




単純にPATHが通っていないだけだった
(読み込みの順番が後の方だった。)


そこで
$ which python
で、どこのを呼んでいるのか確認。
でシンボリックリンクを一度削除して、
今回インストールした /opt/local/bin/python2.7に貼り直せばおーけー
(実際はそれもシンボリックリンクで実物は
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7にある)


$ sudo rm /usr/bin/python
$ sudo ln -s /opt/local/bin/python /usr/bin/python
■Macにインストールする

インストール方法は↓
Software Repositories の一番下に書かれています

またまたmac portを使うらしい。
mac portさまさまですな。


基本的には↓に書かれているものを全部入れてみた
Installing the LSC Software Stack with MacPorts

sudo port install lscsoft-deps
sudo port install glue
sudo port install lalapps
sudo port install pylal


これだけ入れれば、以前自分で書いたソースは実行できるようになった。

・ソース内で行っている事は、バイナリファイル(.gwf)を開く
・あるチャンネルのデータを取り出して、FFTをかける

それくらい

チャンネル名の取得とかは、FrameLibraryの方にあるコマンドを使えばおーけー
(そういえばそっちもまだか・・・・けどあっちはそんな苦労はしないだろう)
■環境の確認。OS : Mac OS X 10.6.8(Snow Leopard)
gcc : 4.2.1

それくらいかな?

ちなみにインストールするpython関係のversionは、
今回は2.7で統一します。




■pythonをインストールし直す

デフォルトで入っているpythonでは何かと相性が悪いらしい(具体的には不明。実際numpyとかscipy入れても動かない)

デフォルトで入っているpythonの置き場所は
$ which python
/Library/Frameworks/Python.framework/Versions/2.7/bin/python
(もしかしたら違うかも・・・・?)


まずはpythonをインストールし直す。
sudo port install python27 +universal +tkinter
けっこう時間がかかります。

ちなみにmac portを使います。
「mac portって何すか?」って方は↓の記事を参照
【Mac】Mac Portsを使ってみる



次はpythonをデフォルトで入っていたものから、今入れたものに選び直します。
$ port select --list python
Available versions for python:
  none (active)
  python25-apple
  python26-apple
  python27
自分の場合はこんな感じでした。

この(active)をpython27に変えたい。
$ sudo port select --set python python27
Selecting 'python27' for 'python' succeeded. 'python27' is now active.

$ port select --list python
Available versions for python:
  none
  python25-apple
  python26-apple
  python27 (active)
(active)の場所が変わった。


これで起動するpythonが変わってるか確認する
$which python
/Library/Frameworks/Python.framework/Versions/2.7/bin/python

変わってない・・・・(汗)
本当は/opt/local/bin以下のpythonが呼ばれてほしい



しょうがないので、.cshrcに
alias python /opt/local/bin/python
と書いてゴリ押す・・・・(いいの?)

→(2012/11/12追記)
なんでうまくいかないのかわかりました。

■参考
【python】シンボリックリンクを貼ればよかったのか


実際にpythonを起動させて、今インストールされたものと同じかどうかチェックしておくと良い。
$ python
Python 2.7.3 (default, Nov 7 2012, 07:08:27)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.





■numpy, scipy, matplotlibをインストール
sudo port install py27-numpy py27-scipy py27-matplotlib
これもけっこう時間がかかる。
インストールが終わったら、設定ファイルを作る

http://matplotlib.sf.net/_static/matplotlibrc
からファイルを落として来て、一部書き換える

backend : TKAgg

backend : MacOSX
のように書き換える
置き場所は
~/.matplotlib/matplotlibrc


これでインストールは終わり。
$ python
> import numpy
> import scipy
> import matplotlib
で何もエラーがでなければうまく動いているはず



■参考
[macports]numpy scipy matplotlib をインストールする
[macports]pythonをインストール
を作って遊んでた。

新しい言語を使ってるとなんか楽しい



2012/11/9追記
このblogの記事の中ではなぜかけっこう検索できてくださる方が多い。
そこで改めてチェックしてみたら下のソースにミスが・・・・(コピーして実行しても動かない)
理由は全角スペースのせいです、はい。


ソースはこちらに置いておきますので、こっちをご利用ください。


素晴らしいね。
色々と楽です。



帰ったら、scipyやらnumpyやら使えるようにして触ってみます
まずは入っているか確認。
特にインストールとかしてないけど、色々と種類が入っていた。

pythonには2.x系と3.x系があるらしい・・・・

自分のmacには2.x系が入っていた。
versionは2.7.1
python -V
で確認できる



とりあえず
print Hello, world



Python をつかったプログラム入門 - 名古屋大学
というpdfを読んで勉強する。
HOME |
プロフィール
HN:coffee
職業:物理屋(自称)
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
#include <stdio.h>
#include "MyProfile.h"

#define TWITTER coffee_pote

#ifdef RICH_FLAG
// ↑いつも支援いただきありがとうございます m(_ _)m
#define WISH_LIST
amazonのほしい物リスト
#endif


int main(void){

printf("\n");
printf("あけましておめでとうございます\n");
printf("今年もどうぞよろしくお願いします\n");
printf("\n");
printf("猿でもわかるgnuplot を執筆中\\
少し追記しました\n");
/* 最終更新 2018/01/01 */
return 0;

}
カウンター
ブログ内検索
ツイートするボタン
リンク
相互リンク募集中です (Twitterにてお知らせください)

Demo scripts for gnuplot version 5
(gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)

gnuplotスクリプトの解説
(米澤進吾さんの個人ページ、gnuplotと言えばこのかた)

gnuplot のページ
(Takeno Lab、うちのブログがリンクされていたのでリンク返し)

とある物理の院生日誌~院生は社会へ旅立った~
(研究室の先輩の個人ブログ)

英語例文を見て自然に英語・英会話を学ぶ
(楠本慶ニさんの個人ページ、様々な情報の密度の高さに感動)

Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco
(映画の感想をまとめられるサイト、いつもお世話になっています)

Astronomy Picture of the Day Archive
(天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)

今日のほしぞら
(任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)

GNUPLOTとアニメーション
(応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)

読書メーター
(読んだ本をリストできる便利なサイト)

Flickr

Template "simple02" by Emile*Emilie
忍者ブログ [PR]