トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

tips-PYTHON3

  PYTHON3 の tips

OpenSUSE leap 15 で user で Python をセルフビルドした時のメモ(pyenv で tkinet が動かない事が始まり)

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 
のとき