投稿

ラベル(Python)が付いた投稿を表示しています

python: pythonスクリプトから実行ファイルを作る、あるいはDLLに作る方法 (nuitka)

Pythonから実行形式のファイル、あるいはDLL 1 や .so などの動的リンクライブラリを nuitka を用いて作成する方法について。 Pythonスクリプトの隠蔽を目的とする場合は暗号化が必要であると思うが、その場合商用ライセンスが必要となる点に注意。 環境は Python 3.9.5 on Windows 10

python: pyenvを導入して特定のバージョンのPythonを動かせるようにする for Ubuntu

イメージ
この記事について pyenv 導入方法 ダウンロード PATH 設定 シェルの再起動 確認 pyenv を利用して python のインストール 事前準備 インストール可能なバージョンを表示する pyenv を利用して python をインストール インストール済で 利用可能な python バージョンを一覧表示 pyenv で現在のログインユーザが使うデフォルト python のバージョンを指定する pyenv で特定のディレクトリでのみデフォルト python のバージョンを指定する pyenv を利用してインストールした python をアンインストール おわりに この記事について 本記事では、マシン上で任意のバージョンが実行できるようになる pyenv のインストールから簡易的な利用方法まで記載していきます。 Pythonに限らず、プログラミング言語はバージョンに依存して新機能が導入されたり、 特定の機能が廃止方向に進んでwarningが表示されるようになってしまったり、といった事象がつきもの。そこで、どんな環境でも特定のバージョンでプログラムを動かすようにできれば、こういった悩みから解放されるはず。 こういった機能は「仮想環境 (virtual environment)」と呼ばれる機能で提供されることが多いです。仮想環境自体は実行環境のバージョンや付随するもろもろのライブラリのバージョンまでまとめて管理するものを指しますが、ここではその実行環境のバージョンを固定する方法を解説しています。 Ubuntu 20.04 で確認。 pyenv は Rubyで同様のことを実施できる rbenv からのforkで作成されたようです。 関連記事: rbenvのインストール方法 pyenv 導入方法 ダウンロード 公式リポジトリ に書いてある通りに実施すればOK。かいつまんで書くと、 git clone https://github.com/pyenv/pyenv.git ~/.pyenv # 以下はBash向け拡張機能のコンパイルなので必須ではない。 cd ~/.pyenv && src/configure && make -C src 上記で p...

python: ログを出力・記録するためのクラスであるloggingの使い方

イメージ
Pythonで簡易的なスクリプトを作成していると、 print でなんでも済ませてしまいがちだが、後から何かしらにモジュール化して組み込むことや、スクリプトのままだとしても不要なログは消すなどの対応が後からとれるようにしたい。その時に利用できるのが logging モジュール。 logging の基本的な使い方 logging は利用を開始する前に basicConfig を利用して設定を行ってあげる必要がある。そのあと、 logging.info などレベルに応じた関数を呼び出してログを書き出す。例えば以下のような形。 import sys import logging logging . basicConfig ( level = logging . INFO , format = "%(asctime)s [%(levelname)s] %(message)s" , handlers = [ logging . FileHandler ( "test.log" ) , logging . StreamHandler ( sys . stdout ) ] ) # 呼び出す関数によってログのレベル(深刻度)設定が変わる logging . info ( "This is a sample of INFO log" ) logging . warning ( "This is a sample of WARNING log" ) logging . critical ( "This is a sample of CRITICAL log" ) ここでの設定値は以下。 level でどのレベル以上のログを出力対象とするか設定している。ここでは INFO 以上のログを出力する設定。 format でログの出力形式を設定。後述。 handlers でログをどこに出力するかを指定。ここでは debug.log というファイルと stdout すなわちコンソールの標準出力を指定している。 level について logging で利用される level は以下の通り。上から強い...

python: デフォルト機能でXMLを解析する

イメージ
Python 3.9.6 で確認。 Pythonにデフォルトで備わっている xml.etree.ElementTree を用いることで簡易的なXML解析が可能。名前が長いので、公式ドキュメントでもエイリアスを使用している。 準備 必要なライブラリを import するには以下。 import xml . etree . ElementTree as ET ファイルから読み出すなら tree = ET . parse ( 'test_data.xml' ) root = tree . getroot ( ) あるいは文字列から読みだすなら root = ET . fromstring ( test_data_str ) という形でアクセスできる。 具体例 具体的な利用例を見てみる。例えば、 Yahooニュースの主要トピックRSS から主要なニュースを取り出し、表示してみる。 URLへのアクセスに requests を利用している。 pip install requests で導入可能。 import xml . etree . ElementTree as ET import requests res = requests . get ( 'https://news.yahoo.co.jp/rss/topics/top-picks.xml' ) # res.contentにデータが格納されている。 # データはUTF-8としてdecodeする必要がある。 root = ET . fromstring ( res . content . decode ( 'utf-8' ) ) items = root . findall ( './channel/item' ) for item in items : title = item . find ( 'title' ) . text print ( f '{title}' ) findall により、指定した XPath に該当する要素をすべて取り出すことができる。XPathは、 簡単に使う分にはXMLの木構造をディレクトリ構造の...

python: bytesからstrへの変換

イメージ
bytes から str への変換について。 decode を利用。 data # ここに utf-8 として読み出せるbyteデータが入っているとする mojiretsu = data . decode ( 'utf-8' ) 例えば、 web上から取得したデータなどに対して上記の操作が必要だったりする。 以下の例では requests というライブラリを用いている。 import requests res = requests . get ( 'https://news.yahoo.co.jp/' ) print ( res . content . decode ( 'utf-8' ) ) 逆に bytes 型に変換したい場合には encode を利用する。 s = u'日本語utf-8' print(s.encode())

matplotlib: 2つのグラフを一度に描画する

イメージ
複数のグラフを表示する 1つまたは2つのファイルから2種類のデータを描画する 縦軸が共通の場合と、異なる場合 例えば以下のようなデータが data.csv という名称で存在するとする。 id,value1,value2 1,0.5,10.4 2,5.4,30.9 3,7.9,80.9 4,10.2,140.9 5,13.2,221.3 同じ軸でプロットしてみる。単に2発Plotすればいいだけ。 こちらの記事も参照 import pandas as pd import matplotlib . pyplot as plt df = pd . read_csv ( 'data.csv' , header = 0 , index_col = 0 ) plt . plot ( df . index , df [ 'value1' ] , marker = 'o' ) plt . plot ( df . index , df [ 'value2' ] , marker = 'x' ) plt . show ( ) 簡単に表示はできるが、異なるスケールであるため青色のプロットの変化が見づらくなってしまっている。 このようにスケールが異なる場合には縦軸を変更すると良い。 # サブプロット (分割プロット) コマンドで軸を取得 fig , ax1 = plt . subplots ( ) # ax1 と Xが共通な軸 = y軸を作成 ax2 = ax1 . twinx ( ) # ax1, ax2に対してプロットを実施 # 区別をつけるために色分け、凡例を出すためにlabelを指定。 ax1 . plot ( df . index , df [ 'value1' ] , color = 'red' , label = '1st line' ) ax2 . plot ( df . index , df [ 'value2' ] , color = 'blue' , label = '2nd line' ) # 各Y軸...

matplotlib: 超単純なデータの可視化

イメージ
 適当なデータをCSV形式で持っているものとする そのデータをグラフ上で示す インストール pip install matplotlib pandas 例えば以下のようなヘッダ付きのCSVファイルがあるとする。ファイル名を data.csv としておく。適当なデータです。 id,value 1,0.5 2,2.8 3,4.9 4,8.6 5,10.9 プロット import pandas as pd import matplotlib.pyplot as plt # 1行目に各列の説明が書かれているので header=0 # 1列目がインデックスに相当するので index_col=0 df= pd.read_csv('data.csv', header=0, index_col=0) # プロットの実施。x, y として使うデータを指定し、〇で表示する # インデックスは .index でアクセスし、それ以外の列は見出し名でアクセス plt.plot(df.index, df['value'], marker='o') # 表示。表示コマンドが分かれているのは、グラフの見た目調整などを別途実施できるため。 plt.show() 環境によりますが、Windowsでは以下のようなグラフが表示されます。表示されたグラフは移動したりズームしたりすることが可能。 ちなみに、df (DataFrameの略、pandasでCSVデータを読んだときに作成されるクラス)の中身を見るには普通に print をしてみるとわかります。 >>> print(df) value id 1 0.5 2 2.8 3 4.9 4 8.6 5 10.9 これ以外のアクセス方やPandas側の機能を利用したPlotもありますのでご確認ください。

Numpy: 2次元配列を画像として保存したい

 2次元のnumpy行列を白黒画像データとして保存する PIL.Image で利用可能な fromarray() を利用します。 未インストールの場合下記でインストールします。 pip install pillow 実際の画像保存は以下のようになります。 from PIL import Image import numpy as np data = np.zeros((512, 512), np.uint8) img = Image.fromarray(data) img.save('test.png')

Numpy: Grey画像 or 単なる2次元配列からRGB画像を生成したい

3つの異なる配列からRGB画像データを作成する 1つのGrey画像 (greyscale image) から RGB 画像データを生成する dstack を利用し、2次元配列 = greyscale画像からRGB画像を生成します。 以下は説明のためnp.zerosで作成していますが、実際は各 r, g, b に必要なデータを入れてください。各Channelの配列サイズは同じである必要があります。 import numpy as np r = np.zeros((512, 512), np.uint8) g = np.zeros((512, 512), np.uint8) b = np.zeros((512, 512), np.uint8) rgb = np.dstack((r, g, b)) 1つの2次元行列からRGB画像に拡張する場合は以下です。 grey = np.zeros((512,512), np.uint8) rgb = np.dstack((grey,)*3) 画像として保存するのであれば以下。 from PIL import Image Image.fromarray(rgb).save('test.png')

virtualenvwrapper を導入する for Raspbian and other OS

イメージ
概要 ¶ Raspbian (Raspberry Piの推奨OS) において Python の仮想環境マネージャ virtualenvwrapper を導入する。 Raspbian以外でも導入可能な書き方をしているのでそれ以外のOSでもOK(のはず) 導入方法 ¶ pip は既に入っているものとします。 Python2.x がデフォルトになっている方は [補足] Python2の脱却 へ。 pip install virtualenvwrapper これでインストールはされましたが、有効化するために更なる設定が必要です。 ~/.bashrc に以下を記載します。 # virtualenvwrapper の設定 export PYVEWRAP = ${ HOME } /.local/bin/virtualenvwrapper.sh export WORKON_HOME = $HOME /.virtualenvs if [ -f ${ PYVEWRAP } ] ; then source ${ PYVEWRAP } else echo " ${ PYVEWRAP } not found." fi 記載したら、 source で .bashrc を読み直しましょう。 再ログインしても構わないです。 source ~/.bashrc 以下のようなメッセージが出れば導入完了です。 not found と表示された方は [補足] virtualenvwrapper.sh を探す へ。 virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postmkproject virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/initialize virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/premkvirtualenv virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/pos...

Web Frameworkの速度比較サイトからどれを使おうかなと選定

イメージ
早さのイメージ Web Frameworkのベンチマークサイトがあったので、レスポンスタイムの観点から調査。 フィルターでフルスタック & メジャーな言語のみでフィルターしてみた。 参考にしたのは こちらのサイト になります。 上位のものを調べてみると、自分は知らないものばかり。 いったいどんなものなんだろう、とざっくり調べたものになります。 Joobyとは Joobyというものが上位を占めている。 Joobyってなんだろう、と調べるとJavaフレームワーク。 Javaって今の時代早くなったんですね。 なんだか昔はJVMで動くから遅いというイメージがあったんです。 Jooby公式サイト DBのORM的なものを入れるとDjangoやRailsのような感じでフレームワークとして動く模様( 参考サイト )。 これだったらRails / Django に慣れている人でも使いやすいかもしれない。 Javaというのでてっきり大仰なコードを書くことになるのかと思ったが、意外とそこまで難しくなさそう。 その他の上位ランカーたちについて Gemini Javaのframeworkらしい。 さっきのベンチマークを公開している会社が作ってるやつのようですね。 GithubのREADMEの説明がものすごく簡素...... https://github.com/TechEmpower/gemini Zebra このMediumの投稿 を見る限り、後述のGiraffeというFrameworkの性能を改善した新規バージョンなのかな? ちょっと探してみても公式サイトらしきものが見当たらず、見つけられたのが 今回のベンチマークのリポジトリ のみ。 中身を見てもあんまりそれらしき記述量じゃないので、Dockerのイメージを引っ張ってる部分に何かあるかとみてみたが、特になさそう。 なので、多分上記リポジトリの中身がZebra本体なのかもしれない。 Act こちらもJavaフレームワーク。公式サイトがhttps未対応だし、色合いが原色すぎて嫌い(調査でもなんでもない) http://actframework.org Cutelyst QtのWeb framework。 Qt自体がUIフレームワークだっ...

[Atom][Python] AtomのパッケージBeautifyでエラー

概要 ¶ AtomにあるBeautifyという整形用のプラグインをPythonに対して利用する際の諸注意 Python対してBeautifyした際にエラー ¶ 要約 pip install autopep8 しましょう AtomにおいてBeautifyをインストールすると ctl+alt+b というショー トカットで動作するようになる。 このときに、Pythonのパッケージとして autopep8 というものが必要となっ ているようなので先にインストールしておく必要がある。 pip install autopep8 注釈 この記事は、、、 昔はこのBearifyのエラーが発生した際に文字化けしていた + Pythonに対 する知識があまりなかったので一体何がダメなのかわからなかったためこ んな記事を書いたんだけど(3年前くらい)、今のAtomなら文字化けとかしな さそうだし、この記事もいらないかも?

[DLL][Python] C++(またはC)言語のDLL作成と読出し

イメージ
環境:Python2.7, Visual Studio Community 2015 概要 ¶ PythonでC言語(というかC++)の関数を呼び出すためのDLLの作成方法および呼 び出し方法について。 追記 検索の仕方が悪かったのか調べてもあまりいい情報が出てこなかったので 書いたのだが、調べてみる下記サイトなどPythonコードの書き方部分に関 して説明がかなり詳しい。なので、このページは主にWindowsのDLLの作製 法みたいな感じで... http://curlnoodle.hatenablog.com/entry/2013/12/30/221858 WindowsにおけるC++製DLLファイルの作成 ¶ 要約: DLL作成のためのプロジェクト設定 extern "C" によるC関数としての宣言 __declspec(dllexport) によるDLLとしての宣言 Linuxだとちょろっと書いたコードをスマートに作成できるらしいのだけれど も、WindowsでサクッとDLLを作成する方法がわからなかったのでVisual Studioのプロジェクトの設定から説明する。: [ファイル] → [新規作成] → [プロジェクト] とクリックしていき、新しいプロジェクトの作成ダイアログを開く。 [インストール済み] → [テンプレート] → [Visual C++] をと左側のリストから選んでいき、真ん中のテンプレート選択部分で [Win32コンソールアプリケーション] を選び、適当な名前を付けて[OK]をクリック。 するとWin32アプリケーションウィザードなるものが始まる。 [次へ] を押す。次の画面で [アプリケーションの種類] → [DLL(D)] を選択し、そのまま完了。 デフォルトで 作ったプロジェクト名.cpp みたいなファイルが開かれていると 思うがここに関数を記述すればOK。以下のような感じ。 extern "C" __declspec ( dllexport ) void test_dll () { std :: cout << "this is the test" ; } キ...