tips-PYTHON3
PYTHON3 の tips
OpenSUSE leap 15 で user で Python をセルフビルドした時のメモ(pyenv で tkinet が動かない事が始まり)
python3.13.7
3.9 のときと同じですが。。メモ
## zypper install zlib-devel tk-devel libopenssl-devel libexpat-devel libffi-devel readline-devel openssl-devel
## sudo zypper install lzma lzma-devel xz-devel
## zypper install tcl-devel
## zypper install tk-devel
## zypper search ffi
wget https://www.python.org/ftp/python/3.13.7/Python-3.13.7.tar.xz
## wget -e HTTPS_PROXY=http://192.168.1.10:8080 https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tar.xz
tar xvfJ Python-3.13.7.tar.xz
cd ./Python-3.13.7
## ##PROXY
## ## export http_proxy=http://192.168.1.10:8080
## ## export https_proxy=http://192.168.1.10:8080
## ./configure --enable-optimizations --prefix=$HOME/opt/python3
./configure --prefix=$HOME/opt/python3 \
--enable-shared \
--with-system-expat \
--with-ensurepip=yes \
--enable-optimizations
make
## make install
make altinstall
## LD_LIB の設定がまずいのかな??
Python cannot find the readline module, until you symlink $prefix/lib/python3.13/lib-dynload to $prefix/lib64/python3.13/lib-dynload.
このトラブルがあるので
cd $PYTHONHOME
ln -s .$PYTHONHOME/lib64/python3.13/lib-dynload/ .$PYTHONHOME/lib/python3.13/lib-dynload
をやっておく
$ python3.13 -m venv 0031300
$ ./0031300/bin/python3.13 -m pip install --upgrade pip \
setuptools wheel cmake cython numba ray
$ ./0031300/bin/python3.13 -m pip install --upgrade pyvirtualdisplay \
Xlib pyautogui
python3.9.7
3.6 のときと同じですが。。メモ
## zypper install zlib-devel tk-devel libopenssl-devel libexpat-devel libffi-devel readline-devel openssl-devel
## sudo zypper install lzma lzma-devel xz-devel
## wget https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tar.xz
wget https://www.python.org/ftp/python/3.9.12/Python-3.9.12.tar.xz
## wget -e HTTPS_PROXY=http://192.168.1.10:8080 https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tar.xz
tar xvfJ Python-3.9.7.tar.xz
cd ./Python-3.9.7
## ##PROXY
## ## export http_proxy=http://192.168.1.10:8080
## ## export https_proxy=http://192.168.1.10:8080
## ./configure --enable-optimizations --prefix=$HOME/opt/python3
./configure --prefix=$HOME/opt/python3 \
--enable-shared \
--with-system-expat \
--with-system-ffi \
--with-ensurepip=yes \
--enable-optimizations
make
## make install
make altinstall
## LD_LIB の設定がまずいのかな??
Python cannot find the readline module, until you symlink $prefix/lib/python3.6/lib-dynload to $prefix/lib64/python3.6/lib-dynload.
このトラブルがあるので
cd $PYTHONHOME
ln -s .$PYTHONHOME/lib64/python3.9/lib-dynload/ .$PYTHONHOME/lib/python3.9/lib-dynload/
をやっておく
#
# PIP などのアップデート
$ pip3.9 install --upgrade pip setuptools wheel cpython
#
PY-venv で使う
setenv_python39
$ more setenv_python39 ## export https_proxy=http://127.0.0.1:18080 ## export http_proxy=http://127.0.0.1:18080 ## export HTTPS_PROXY=http://127.0.0.1:18080 ## export HTTP_PROXY=http://127.0.0.1:18080 MYOPTD=$HOME/opt PROJ4D=$MYOPTD/proj4 PYTHONHOME=$MYOPTD/python3 export PYTHONHOME PYTHONPATH=$PYTHONHOME:$PYTHONPATH PYTHONPATH=$PYTHONHOME/lib64:$PYTHONHOME/lib64/python3.9:$PYTHONPATH PYTHONPATH=$PYTHONHOME/lib:$PYTHONHOME/lib/python3.9:$PYTHONPATH export PYTHONPATH LD_LIBRARY_PATH=$PYTHONHOME/lib:$PYTHONHOME/lib64:$PROJ4D/lib64:$LD_LIBRARY_PATH export LD_LIBRARY_PATH PATH=$PYTHONHOME/bin:$PROJ4D/bin:$PATH export PATH export PKG_CONFIG_PATH=$HOME/opt/python3/lib64/pkgconfig:$PROJ4D/lib64
# python3.6.3 のインストール
## install zlib-devel openssl-devel tk-devel libopenssl-devel
## zypper install zlib-devel tk-devel libopenssl-devel libexpat-devel libffi-devel readline-devel #oenssl-devel
wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tar.xz
tar xvfJ Python-3.6.3.tar.xz
cd Python-3.6.3
## ./configure --enable-optimizations --prefix=$HOME/opt
./configure --prefix=$HOME/opt/python3 \
--enable-shared \
--with-system-expat \
--with-system-ffi \
--with-ensurepip=yes &&
make
make install
make altinstall
https://bugs.python.org/issue15631
When installing Python 3.6.3 from source on openSUSE Leap 42.2, this bug still occurs.
Python cannot find the readline module, until you symlink $prefix/lib/python3.6/lib-dynload to $prefix/lib64/python3.6/lib-dynload.
ln -s ./lib64/python3.6/lib-dynload/ ./lib/python3.6/lib-dynload/
PYENV で PY-pyenv
# Python 3.6.5のインストール pyenv install --list pyenv install 3.6.5 # デフォルトを3.6.5にする pyenv global 3.6.5 python --version # pipのアップデート pip3 install --upgrade pip # Pythonの仮想スクリーンモジュール追加(これがあるとXvfbをいちいち起動状態にしなくていい) pip install pyvirtualdisplay # ブラウザ操作のためにSelenium pip install selenium # pyautoguiを入れるための依存ライブラリXlibを追加しておく pip install Xlib #PyAutoGUIはDisplayがないとインストールがこけるので、一時的にXvfbで作ってやる #ディスプレイが繋いである場合はstartxしてXを起こしてからpip install pyautoguiすれ ばいい touch ~/nohup.out export DISPLAY=:1.0 /usr/bin/nohup /usr/bin/Xvfb :1 -screen 0 1920x1080x24 & # マウスとキーボードの操作をするのでpyautoguiを入れる pip install pyautogui
pyvirtualdisplay : ヘッドレスモードで実行的ないアプリを走らせるモジュール(Mac/Linux用) sikuli : 高機能自動化フレームワーク openpyxl : MS-Excel(2007以降)の読み書き ## win32api : WindowsのDLLを呼べる(Windows用) ## win32gui : Windowsのウインドウを操作できる(Windows用) ## win32cui : Windowsのコマンドラインの操作ができる(Windows用) requests : WEBにPost/Getを投げる lxml : html/xmlのパーサ json : json/jsonlのパーサ selenium : ブラウザを制御するテスト用モジュール(各種ブラウザのドライバが必要) pyautogui : マウス操作、キーボード操作、画像マッチング
# xml/html pip3 install lxml # json pip3 install simplejson # xlsx pip3 install openpyxl # tsv pip3 install tsv
PYJSON
pip3 install PyJSONViewer
Pythone の setenv_pyhon36
MYOPTD=$HOME/opt PROJ4D=$MYOPTD/proj4 PYTHONHOME=$MYOPTD/python3 export PYTHONHOME PYTHONPATH=$PYTHONHOME:$PYTHONPATH PYTHONPATH=$PYTHONHOME/lib:$PYTHONHOME/lib/python3.6:$PYTHONPATH PYTHONPATH=$PYTHONHOME/lib64:$PYTHONHOME/lib64/python3.6:$PYTHONPATH export PYTHONPATH LD_LIBRARY_PATH=$PYTHONHOME/lib64:$PYTHONHOME/lib:$PROJ4D/lib64:$LD_LIBRARY_PATH export LD_LIBRARY_PATH PATH=$PYTHONHOME/bin:$PROJ4D/bin:$PATH export PATH export PKG_CONFIG_PATH=$HOME/opt/python3/lib64/pkgconfig:$PROJ4D/lib64
Python apli のディストリビューション
https://docs.python.jp/3/distutils/builtdist.html
Python のモジュールを(画像処理関連)
PRINT で改行しない
print ("foo bar", end="")
print ("foo bar", end="\n") ## 行頭にカーソルが移動
仮想環境を作る(必要なら)
virtualenv を使う場合: pip install virtualenv virtualenv <DIR> source <DIR>/bin/activate venv を使う場合: python3 -m venv <DIR> source <DIR>/bin/activate
GUI
python -m pip install tkeasygui
EML ファイルの表示
#!/usr/env python3
# coding:utf-8
"""
emlファイルを元に扱いやすい様にデータを取得する
サンプル。
あくまでい最低限の実装のため考慮漏れなどがあるかも。。。
"""
import sys
import email
from email.header import decode_header
class MailParser(object):
"""
メールファイルのパスを受け取り、それを解析するクラス
"""
def __init__(self, mail_file_path):
self.mail_file_path = mail_file_path
# emlファイルからemail.message.Messageインスタンスの取得
with open(mail_file_path, 'rb') as email_file:
self.email_message = email.message_from_bytes(email_file.read())
self.subject = None
self.to_address = None
self.cc_address = None
self.from_address = None
self.body = ""
# 添付ファイル関連の情報
# {name: file_name, data: data}
self.attach_file_list = []
# emlの解釈
self._parse()
def get_attr_data(self):
"""
メールデータの取得
"""
result = """\
Subject: {}
FROM: {}
TO: {}
CC: {}
-----------------------
BODY:
{}
-----------------------
ATTACH_FILE_NAME:
{}
""".format(
self.subject,
self.from_address,
self.to_address,
self.cc_address,
self.body,
",".join([ x["name"] for x in self.attach_file_list])
)
return result
def _parse(self):
"""
メールファイルの解析
__init__内で呼び出している
"""
self.subject = self._get_decoded_header("Subject")
self.to_address = self._get_decoded_header("To")
self.cc_address = self._get_decoded_header("Cc")
self.from_address = self._get_decoded_header("From")
# メッセージ本文部分の処理
for part in self.email_message.walk():
# ContentTypeがmultipartの場合は実際のコンテンツはさらに
# 中のpartにあるので読み飛ばす
if part.get_content_maintype() == 'multipart':
continue
# ファイル名の取得
attach_fname = part.get_filename()
# ファイル名がない場合は本文のはず
if not attach_fname:
charset = str(part.get_content_charset())
if charset:
self.body += part.get_payload(decode=True).decode(charset,errors="replace")
else:
self.body += part.get_payload(decode=True)
else:
# ファイル名があるならそれは添付ファイルなので
# データを取得する
self.attach_file_list.append({
"name": attach_fname,
"data": part.get_payload(decode=True)
})
def _get_decoded_header(self, key_name):
"""
ヘッダーオブジェクトからデコード済の結果を取得する
"""
ret = ""
# 該当項目がないkeyは空文字を戻す
raw_obj = self.email_message.get(key_name)
if raw_obj is None:
return ""
# デコードした結果をunicodeにする
for fragment, encoding in decode_header(raw_obj):
if not hasattr(fragment, "decode"):
ret += fragment
continue
# encodeがなければとりあえずUTF-8でデコードする
if encoding:
ret += fragment.decode(encoding)
else:
ret += fragment.decode("UTF-8")
return ret
if __name__ == "__main__":
## result = MailParser(sys.argv[1]).get_attr_data()
result = MailParser("sample.eml").get_attr_data()
print(result)
URL ENCODE
#/bin/env python3
import urllib
from urllib.parse import urlparse
# parsed = urllib.parse.urldecode("http://example.com/example.html?foo=bar&hoge=fuga")
parsed = urllib.parse.urlparse("http://example.com/example.html?foo=bar&hoge=fuga")
print ( parsed.scheme )
print ( parsed.hostname )
print ( parsed.path )
print ( parsed.query )
query = urllib.parse.parse_qs(parsed.query)
print ( query )
tag_value = urllib.parse.unquote('%be%f0%ca%f3%c0%af%ba%f6%b2%dd')
print ( tag_value )
py-serial
書き出し
ser.write(b'pp'+str(pan_pos).encode()+b'\n')
gattlib のインストール
https://pypi.org/project/gattlib/ で gattlib-0.20150805.tgz のインストールで setup.py の boost_libs = ["boost_python-py34"] を boost_libs = ["boost_python-py3"] に修正 pip3 install gattlib pip3 install bluepy のとき