L'Isola di Niente
L'Isola di Niente » PyGObject Tips » GLib(PyGObject) Tips

GLib Tips

User Directory を得る
#!/usr/bin/env python3

from gi.repository import GLib

user_directory = {
    "Desktop": GLib.UserDirectory.DIRECTORY_DESKTOP,
    "Documents": GLib.UserDirectory.DIRECTORY_DOCUMENTS,
    "Download": GLib.UserDirectory.DIRECTORY_DOWNLOAD,
    "Music": GLib.UserDirectory.DIRECTORY_MUSIC,
    "Pictures": GLib.UserDirectory.DIRECTORY_PICTURES,
    "Public": GLib.UserDirectory.DIRECTORY_PUBLIC_SHARE,
    "Templates": GLib.UserDirectory.DIRECTORY_TEMPLATES,
    "Videos": GLib.UserDirectory.DIRECTORY_VIDEOS
}

for key, value in user_directory.items():
    print("{0}: {1}".format(key, GLib.get_user_special_dir(value)))
    #=> ~/.config.user-dirs.dirs で指定されたディレクトリ名

環境変数を得る
#!/usr/bin/env python3

# 参照
# http://developer.gnome.org/glib/stable/glib-Miscellaneous-Utility-Functions.html

from gi.repository import GLib

GLib.get_current_dir() #=> 現在のカレントディレクトリ
GLib.get_home_dir() #=> ホームディレクトリ
''' その他
get_system_config_dirs
get_system_data_dirs
get_tmp_dir
get_user_cache_dir
get_user_config_dir
get_user_data_dir
get_user_name
get_user_runtime_dir
'''
GLib.setenv('HOGE', 'hogehoge', False) # 環境変数のセット
print(GLib.getenv('HOGE')) #=> 環境変数の取り出し

for key in GLib.listenv():
    print("{0}={1}".format(key, GLib.getenv(key))) #=> 引数で指定された環境変数キーの値

ファイル名リストの自然順ソート
#!/usr/bin/env python3

from gi.repository import GLib

l = [
"40.txt",
"200.txt",
"001.txt",
"2.txt",
"03.txt",
"123456.txt"]

def sort_func(str1, str2):
    """
        str1.encode("utf8") is not required.
        Not 'cmp' function in Python3
    """
    cmpstr1 = GLib.utf8_collate_key_for_filename(str1, -1)
    cmpstr2 = GLib.utf8_collate_key_for_filename(str2, -1)
    # cmp function
    if cmpstr1 < cmpstr2:
        return -1
    elif cmpstr1 > cmpstr2:
        return 1
    return 0

def cmp_to_key(mycmp):
    """
        http://docs.python.jp/3.3/howto/sorting.html
        Convert a cmp= function into a key= function
    """
    class K(object):
        def __init__(self, obj, *args):
            self.obj = obj
        def __lt__(self, other):
            return mycmp(self.obj, other.obj) < 0
        def __gt__(self, other):
            return mycmp(self.obj, other.obj) > 0
        def __eq__(self, other):
            return mycmp(self.obj, other.obj) == 0
        def __le__(self, other):
            return mycmp(self.obj, other.obj) <= 0
        def __ge__(self, other):
            return mycmp(self.obj, other.obj) >= 0
        def __ne__(self, other):
            return mycmp(self.obj, other.obj) != 0
    return K

l.sort(key=cmp_to_key(sort_func))
for s in l:
    print(s)

# Python2
#l.sort(lambda x, y : cmp(GLib.utf8_collate_key_for_filename(x, -1), GLib.utf8_collate_key_for_filename(y, -1)))
#for s in l:
#    print s

''' output
001.txt
2.txt
03.txt
40.txt
200.txt
123456.txt
'''

日本語を含む文字列の長さ取得
#!/usr/bin/env python3

from gi.repository import GLib

# Python3 x86_64 の文字列は UCS-4
print(len("ちゆ12さい")) #=> 6

# Python2
#print GLib.utf8_strlen("ちゆ12さい", -1) #=> 6L
#print len("ちゆ12さい") #=> 14

コマンドの実行、コマンド出力を得る
#! /usr/bin/env python3

from gi.repository import GLib

# Execute
GLib.spawn_command_line_async("gvfs-open hoge.txt")
# Get Output
result, output, error, status = GLib.spawn_command_line_sync("ls -l")
# output is binary
print(output.decode("utf-8"))
# Python2
#print(output)

ファイル名ユーティリティ
#!/usr/bin/env python3

# Python なら os.path、又は Gio からも一部可能です
# 実装で一番最適と思われる手段は自身で選んでください

from gi.repository import GLib

s = "/home/oyaji/エロ画像/乳.png"

# ディレクトリ名
print(GLib.path_get_dirname(s))
# ファイル名のみ
print(GLib.path_get_basename(s))
# 絶対パスチェック
print(GLib.path_is_absolute(s))
# URI に変換
hostname = "NOTEPC" # ホスト名(サーバー名)不要なら None でいい)
uri =(GLib.filename_to_uri(s, hostname))
print(uri)
# パス名に戻す
path, host = GLib.filename_from_uri(uri) # PyGobject 3.8
print(path)
print(host)
# フルパス作成(区切り文字の有無を自動調節)
print(GLib.build_filenamev(["/home/oyaji/", "/エロ画像", "尻.png"]))

テキストファイルの読み書き
#!/usr/bin/env python3

from gi.repository import GLib

TEXT = "書き込み及び読み込みができない場合は例外が発生します"

# Write
try:
    # Python3 文字列は UCS-4 なので encode する
    utf8str = TEXT.encode("utf-8")
    result = GLib.file_set_contents("write.txt", utf8str)
    if result:
        print("Write Success")
except Exception as e:
    print("Error @ {0}".format(e))

# Read
try:
    result, contents = GLib.file_get_contents("write.txt")
    if result:
        # 上記のとおりなので decode する必要あり
        utf8str = contents.decode("utf-8")
        print(utf8str)
        print("Read Success")
except Exception as e:
    print("Error @ {0}".format(e))

ファイルのテスト
#!/usr/bin/env python3

from gi.repository import GLib

# ディレクトリでは無いか(シンボリックリンク含む)
print(GLib.file_test("hoge.py", GLib.FileTest.IS_REGULAR))
# シンボリックリンクか
print(GLib.file_test("hoge.py", GLib.FileTest.IS_SYMLINK))
# ディレクトリか
print(GLib.file_test("hoge.py", GLib.FileTest.IS_DIR))
# 実行可能ファイルか
print(GLib.file_test("hoge.py", GLib.FileTest.IS_EXECUTABLE))
# 存在確認
print(GLib.file_test("hoge.py", GLib.FileTest.EXISTS))

タイマー
#!/usr/bin/env python3

# g_timeout_add 処理を行うには mainloop が必要

from gi.repository import GLib

count = 0
mainloop = GLib.MainLoop()

def on_timer():

    global count, mainloop

    if count == 10:
        mainloop.quit()
    else:
        count += 1
        print(count)
        return True

GLib.timeout_add(100, on_timer)
mainloop.run()

日付けと時刻
#!/usr/bin/env python3

from gi.repository import Gtk, GLib

class DigitalWatch(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.label = Gtk.Label("0000.00.00\n00:00:00")
        self.add(self.label)
        self.connect("delete-event", Gtk.main_quit)
        self.show_all()
        GLib.timeout_add(1000, self.on_timer)

    def on_timer(self, data=None):
        date_time = GLib.DateTime.new_now_local()
        text = date_time.format("%Y.%m.%d\n%H:%M:%S")
        self.label.set_text(text)
        return True

DigitalWatch()
Gtk.main()

文字コード(cp932, utf8)変換
#!/usr/bin/env python3

"""
    g_file_get_contents で得られるのはバイナリ
    つまり CP932 のままなのでそのまま decode を呼べる
    というか Python 標準機能のほうが簡単ですが...

    f = open(sys.argv[1], encoding="cp932")
    print(f.read())
    f.close()
"""

import sys
from gi.repository import GLib

try:
    result, contents = GLib.file_get_contents(sys.argv[1])
    if result:
        try:
            str932 = contents.decode("cp932")
            print(str932)
        except Exception as e:
            print("ConvertError: {0}".format(e))
except Exception as e:
    print("FileError: {0}".format(e))
Copyright(C) sasakima-nao All rights reserved 2002 --- 2017.