ラベル パイソン の投稿を表示しています。 すべての投稿を表示
ラベル パイソン の投稿を表示しています。 すべての投稿を表示

2020年3月21日土曜日

デバッグ注意

関数値の戻り値の型に注意!



以下をみてもらいたい
なぜか、
実際にはバグでFalseでなく0が返却されてと仮定します。

if文で比較時にキャストされてしまい、Falseになるのです。

>>> a
0
>>> bool(a)
False



a=func1()
#a=0
if a== False :print "OK" # OKが出力された


>>> assert isinstance( a, bool )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError




改善策
func1は、数字が返却とは、想定していなかった
==>assertを使用して関数の戻り値をチェックする

a=func1()
#a=0

assert isinstance( a, bool )
if a== False :print "OK" # OKが出力された


*ちょっと一般的に設計したがる戻り値

正常の場合は、整数値を返却する
エラーの場合は、Falseを返却

例題で、こんなものはどうだろうか?
あまり処理内容は意味がないが
(ただし、戻り値0もあり)

def func2(num):

 data  = num * 2 -10
 if data <0:
  return False
else:
 return data


ret = func2( 5 )
if ret == False :
 print("error")
else:
 print("num=", ret)

改善策!
if  isinstance( ret, bool ) and ret == False :
 print("error")
else:
 print("num=", ret)

でも、もっと良い方法がある「is」を使うのである
「is」は同一オブジェクトかを判定する。

if  ret is False :
 print("error")
else:
 print("num=", ret)




個々のオブジェクト(インスタンス)には、idが振られている。
id( 調べたいオブジェクト )で調べられ、同一オブジェクト化を判定できる


結論
・if文で比較の場合、
比較がTrueかFalseしかないと断言できる場合は
if data:~
if not data:~
がわかりやすい!
しかし、assertを入れておくと保険になりますよ!

・if文で比較の場合、
比較がTrueかFalseしかないと断言が心配なら
if data is True等がベストです。

※「==」は、キャストが行われるので…




assertは,
__debug__(組み込み定数)がTrueの時実行、通常はTrue
assertさせないは、
起動時のコマンドラインのオプションで「-O」にする
(同時に__debug__がFalseになる)


結論2
Noneも同様がわかりやすいね(スピードがはやい)
 if data is None: ~

まとめ
if data is True:~
if data is False:~
if data is None:~
if data is not None:~

2019年7月20日土曜日

パイソン exe化する

パイソンをexe化するのは、簡単にできました。

pyinstallerが必要です、インストールします。

pip install pyinstaller

pyinstaller ファイル名  [--onefile] [--noconsole]

pyinstaller  test.py --onefile

buildとdistというフォルダが作成されるので、distフォルダの作成されたexeファイル
を実行します。







通常は、パイソンプログラムが、自分で作成したファイルを動かしてくれます。

こんな感じです。

・プログラムを書きます。
test.py
for i in range(10):
 print i

・実行です
python test.py

実行すると、数字が表示されます。

exe化すると、pyhtonがいりません。
test.exeがあるだけです。






2019年3月23日土曜日

python3系にwxpythonをインストール (エラーあり-の, 終わらないし)


python3系にwxpythonをインストール


自分は、ServersMan@VPSなので、GUI環境ではない。

バージョン確認
root@localhost:~# cat /etc/issue
Ubuntu 14.04.5 LTS \n \l

64bitです(32bitはi686と表示らしい)
root@localhost:~# arch
x86_64


なので色々と大変だった。
GUI関係がインストールされていないのである、
以下をインストールしたらエラーがなくなった。
GTK+
OpenGL
GStreamer
webkit


python3.6  -m pip install wxpython
で実行したが、なかなか終わらない?
(ループしているようだったが、調べるとかなり時間がかかるらしい「数時間から日レベル」)

途中でキャンセルした。


python3.6  -m pip install wxpython
Collecting wxpython
  Using cached https://files.pythonhosted.org/packages/17/74/7c3ced03c3c76b9f98e4a0edae1801755a7599ebf481c04d9f77dfff17e3/wxPython-4.0.4.tar.gz
Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from wxpython) (1.11.0)
Requirement already satisfied: Pillow in /usr/local/lib/python3.6/dist-packages (from wxpython) (5.4.1)
Building wheels for collected packages: wxpython
  Building wheel for wxpython (setup.py) ... /^canceled
Operation cancelled by user

そこで、ネット上のwheel を利用して再インストールしてみた。
https://extras.wxpython.org/wxPython4/extras/
から、linux->gtk3->ubuntu14.04
と自分の必要とするものを探して利用しますよ。


python3.6  -m pip install https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-14.04/wxPython-4.0.2-cp36-cp36m-linux_x86_64.whl
Collecting wxPython==4.0.2 from https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-14.04/wxPython-4.0.2-cp36-cp36m-linux_x86_64.whl
  Downloading https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-14.04/wxPython-4.0.2-cp36-cp36m-linux_x86_64.whl (142.9MB)
    100% |????????????????????????????????| 143.0MB 28kB/s
Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from wxPython==4.0.2) (1.11.0)
Collecting PyPubSub (from wxPython==4.0.2)
  Downloading https://files.pythonhosted.org/packages/1a/41/a0aceb552d8ec63bb1e8223d130f9dd0f736470036d75d708183b104a2cb/Pypubsub-4.0.3-py3-none-any.whl (61kB)
    100% |????????????????????????????????| 61kB 109kB/s
Installing collected packages: PyPubSub, wxPython
Successfully installed PyPubSub-4.0.3 wxPython-4.0.2



間違えた場合は、こんな感じ(like this)
cp35はヴァージョンpyhton3.5でした、自分はpython3.6なので、cp36
その他OSのバージョンなどを注意深く確認する必要がありますね!

wxPython-4.0.0a3.dev3059+4a5c5d9-cp35-cp35m-linux_x86_64.whl is not a supported wheel on this platform.


参考URL
Ubuntu 16.04 に wxPython (Python3用) をインストール
ubuntu16.04のpython3にwxpythonをインストールする

2018年12月15日土曜日

パイソンのデバッガー



音声はないですが、どうでしょうか?

http://simple-and-useful.net/

のサイトで、サックとコーディングしてデバッグです。


2018年10月17日水曜日

パイソンのデバッグ テクニック2


今回は、プログラムのどこを流れたかを確認する関数を作成しました。
プログラムの流れをトレースするのに便利な関数です


print文により、ソースファイル名、関数名、行番号が表示されます。
以下の変数に格納されます。

fileNm  ソースファイル名
funcNm  関数名
lineNo    行番号


表示フォーマットは、自分の好きなようにカスタマイズしてくださいね!
現在は、こんな感じです。

test.py main:15
test.py func:12




🔸トレースに便利な関数

def dbg():

  frame = inspect.currentframe().f_back

  fileNm = os.path.basename(frame.f_code.co_filename)
  funcNm = frame.f_code.co_name
  lineNo = frame.f_lineno

  print( fileNm, "%s:%s" %(funcNm, lineNo) )





🔸ソース全体  ( test.py )
こちらをコピペすれば動作が確認できると思います。


import inspect
import os

def dbg():
  frame = inspect.currentframe().f_back
  fileNm = os.path.basename(frame.f_code.co_filename)
  funcNm = frame.f_code.co_name
  lineNo = frame.f_lineno

  print( fileNm, "%s:%s" %(funcNm, lineNo) )

def func():
  dbg()

def main():
  dbg()
  func()


main()



以下のリンク先のNpdbですぐに確認しよう!
----------------------------------------------------------------------------------
誰でも簡単に使える、 クラウド パイソンデバッカー (IDE/編集可能)
 Npdb

リンク先は、  http://simple-and-useful.net/index-j.html
----------------------------------------------------------------------------------

2018年10月7日日曜日

パイソンのデバッグ テクニック1

ここでは、パイソンのデバッグテクニックとして
デバッグ関数を作成してみた。
以下がその関数である。



def mydbg( s ):

    print( s )

    fileName ="dbg.txt"
    with open( fileName, mode='w') as f:
        f.write(s)
    
    
    
mydbg("abcdefg")








ご存知だと思いますが、上記をモジュールにして
(モジュールにするには、上のソースをmydbg.pyのファイル名にして
カレントフォルダーに保存します)

インポートするには、簡単です
こんな感じでインポートすればOKですね。



#import mydbg
from mydbg import *

mydbg("douda-hyouji")



----------------------------------------------------------------------------------
誰でも簡単に使える、 クラウド パイソンデバッカー (IDE/編集可能)
 Npdb

リンク先は、  http://simple-and-useful.net/index-j.html
----------------------------------------------------------------------------------

2018年7月22日日曜日

python debugger (pdb vs npdb)

パイソンの標準デバッカー(pdb)とクラウドデバッカー(npdb)

■デバックについて

プログラムを書き実行してみると、うまくいかない事が多い。
1回で動く事は、稀でありそのためにデバック作業が発生するのである。

自分の経験(40年前から)から、全然かわらないが
一つ言える事がある、以前より大変になった事である。

人間社会も同じことだけど、プログラム環境もより複雑になり多くの時間を
簡単なことに費やしています。

では、デバックの基本とは、

①プログラムの流れが正しいかを確認
②変数(データ)が正しく設定されているか
③後、厄介なのは、タイミングである
 以前(大昔)は、必ずプログラムの流れは1つであったが、
 スレッド、プロセス、タイマー、割り込みなど、ある処理が動作している時に
 他の流れを考えながらデバックをしなけらばいけない。

①、②は画面などに表示をしてみる事で、だいたい大丈夫。
③はタイミングなので、ファイルにプログラムの流れをタイムスタンプと一緒に書き込みを
 おこない確認をするしかない。
 へたにデバッカーに頼ると思いもかけない時間を浪費してしまう。


■デバッカーは必要か?

 自分は、NOと言いたいがどんなもんだろうか?
 自分が若い時は、コボルという事務処理言語かなり主流だった

 勿論、デバッカーなど無い大型コンピュータでプログラムをタイピストに依頼して
 マシンタイムに動作させ、結果を確認。
 問題があれば、Display文などを、お粗末なエディターで数行いれて、
 実行待ち、複数人数で使用しているから結果はすぐにはでない。

 そしてその日の割り当てられたマシンタイムは終わり、結果印刷物を会社に持って帰り
 再検討、机上デバックする。

 こんな感じであった、勿論再検討する際にはデバックをおこなう、机上で変数名に現在何が
 入っているか?もしこちらに処理が移ってしまっていたらどうなるのか?

 かなり机上で確認しているから、実際のマシンタイムではうまく動いていくのである。

 3回ぐらいマシンで正常動作させて、次にはテストフェーズにはいる。
 テストケースを机上で考えて、前述のように周到な準備をおこない。
 テストをおこなう。

 今思うとなつかしい。
 

■pdb





変数名
変数名=

順番に、

step, next, return, continue, break
であるなんとなく想像できる単語である

stepは単語の意味どうり
1行ごとだけど、日が暮れちゃうね

nextはstepよりちょっと早くできる、関数、メソッドを通過する
関数値等を確認は、nextを実行後代入された内容をみてみる
(いまさらですが、現在の実行を示す位置は、実行前ですよ)

returnは、stepで関数内部に入り、途中で関数から出たくなった場合に使う。
pdbでは、関数をリターンする前に止まるので、ここでも関数値を確認できる

「関数値の確認方法」

continue文
cでオーケーだが、contでもいい。
時にはcontと打ってデバックをしたいと思うが、自分の性格上だめである

cont,continue(スペル間違いが無ければいいが)を打つ余裕が、時短で良いデバックができるのも
真実であるように思える。

自分は煙草を吸わないが、家事や身の回り、机まわり等を掃除、整頓するのも良いのではないかな。

また、難問にぶつかってしまったら、散歩、買い物をするのも良いのでは。。
(自分は、買い物でアルコールを買うので、そこまでのデバックなってしまうので。。。どうか)

おすすめは、最初に「contする」です
パイソンの場合は、コンパイルしないでの実行時にエラーが発生するからです。

もしかすると、最初で天国に行くことができて、弾みがでて細かなデバックができることも
多々あるからです。

うまくいかない場合は、適当なところにbreak文でストップしてみましょう。

以外とその途中まで行っていないケースは自分の場合多かったです。

最初にimport
次にファイルの入力
関数をコールしてなかった、条件がかなり違っているなど。

様々ですが、本当はプルグラムを印刷して机上デバックすればかなり早いのですが。。。

時代ですね。。。

今日は、ここまで終わりです。

歯科に行く予定なので、一時的な公開をしますよ




以下は、未完ですよ
(上もこれからだけど)



これだけをマスターすれば、快適なデバックが行える。


しかし、もっと単純化すれば以下の3単語(コマンド)だけでよいのかもしれません。
tbreak
cont
p 変数名

tbreakとは、一時的なブレークポイントである

書き方は、tbreak ファイル名:行番号でファイル名を省略することもできます

次に、「cont」コマンドでブレークポイントまで処理を実行

実行後に変数の内容を確認する

※p 変数名で変数の内容が表示されるが、変数名がデバッカーのコマンド
重複しない場合は、pは省略可能であります。





最初に、対象のスクリプを表示してみましょう。


次に対象の関数内で処理を止めてみる
(いわゆるブレークポイントの設定である)

そこ箇所の変数名を表示してみる

関数の値を確認する



次回は、例題をあげてデバックしてみたいですね


例題1

1〜10までを加算するプログラム


例題2

文字列を扱う






デバック、デバッカーとは

プログラムは、命令文である
命令文には、決まり事があり人には間違いがある

そのためにデバックが必要なのだ。




2018年7月16日月曜日

パイソンIDE (Edit,Debug)


Npdb

クラウドで、パイソンのデバッグと編集ができるのだ。

URLはこちらだ
http://simple-and-useful.net/netpdb/npdb.html


画面が表示されると、hello.pyのソースコードが表示される
アイコン(debug-start)でデバック開始である。



現在は編集モードですよ



デバックアイコンをクリックすると、色がグリーンになり
デバックモードになる





アイコン(next)をクリックすると次のステップにいきます、

プログラムが最後の行になると、リスタートして最初の行に戻ります。




デバックアイコン(debug-end)をクリックすると

デバックが終了して、編集が可能になります