!! 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 のモジュールを(画像処理関連) [[画層処理で遊ぶために|tips-PYTHON-graphics]] ! PRINT で改行しない print ("foo bar", end="") print ("foo bar", end="\n") ## 行頭にカーソルが移動 !仮想環境を作る(必要なら) virtualenv を使う場合: pip install virtualenv virtualenv source /bin/activate venv を使う場合: python3 -m venv source /bin/activate ---- !GUI *https://github.com/kujirahand/tkeasygui-python 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 のとき