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

tips-PYTHON3

  PYTHON3 の tips

python3.6.3 のインストール

## install zlib-devel openssl-devel tk-devel libopenssl-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/

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="")

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)