トップ 一覧 検索 ヘルプ RSS ログイン

tips-PYTHON3の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!! PYTHON3 の tips
! 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/
----
 # 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="")

!仮想環境を作る(必要なら)

 virtualenv を使う場合:
 
 pip install virtualenv
 virtualenv <DIR>
 source <DIR>/bin/activate
 
 venv を使う場合:
 
 python3 -m venv <DIR>
 source <DIR>/bin/activate

----

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