そういえば Seed で環境変数を使うにはどうすればいいのだろう?
Python のように便利な標準モジュールみたいなのは無いわけで。
多分 glib 等に頼るしかないのだろう。
Miscellaneous Utility Functions
glib に env 関連はあるね。
#!/usr/bin/env seed GLib = imports.gi.GLib; Seed.print(GLib.getenv("HOME")) GLib.setenv("HOGE", "Madoka Magica") Seed.print(GLib.getenv("HOGE"))
これでイケる、GLib.get_home_dir() でも $HOME は取れる。
でも日本語を getenv だと ? になって print されてしまった。
インタラクティブシェルなら問題なく日本語表示している。
? の文字数は合っているから UTF-8 だと認識はしているみたいだが何故だろう。
Python の coding:utf-8 指定のようなものが何か必要なのか?
そういえばファイルを読み書きする open() も無いよな。
gio で読み書きするしか方法が無いと思うけど。
Seed/Tutorial – GNOME Live!
Seed/Tutorial/Simple_file_io – GNOME Live!
GDataInputStream, GDataOutputStream を噛ます必要があるようです。
Streaming I/O
なんか面倒くさいけど以下で読み書きできた。
読み込みはよくある一行毎に処理する方法にしている。
#!/usr/bin/env seed /* Streaming I/O File Read and Write Sample if the Seed ( null parameter is not needed ) */ Gio = imports.gi.Gio; var filename = "test_js.txt"; var lines = "madoka\nhomura\nmami\nsayaka\nkyoko"; // Write var f = Gio.file_new_for_path(filename); var fstream = f.replace(); var dstream = new Gio.DataOutputStream.c_new(fstream); dstream.put_string(lines); fstream.close(); // Read f = Gio.file_new_for_path(filename); fstream = f.read(); dstream = new Gio.DataInputStream.c_new(fstream); while (1) { var text = dstream.read_line_utf8(); if (text == null) break; Seed.printf("%s(%d)", text, text.length) } fstream.close();
日本語でも書き込みはできた、けれどアウトプットはやはり ? になる。
それと length を取得する方法が無いみたい、int では値渡しになるし…
コレで gi にて Streaming I/O を使う方法が解ったぞと。
ということは PyGI で同様にするには以下のように。
ほぼ同じだったけど微妙に違う。
#!/usr/bin/env python #-*- coding:utf-8 -*- ''' Streaming I/O File Read and Write Sample if the Python ( All None parameter @ GCancellable ) ''' from gi.repository import Gio filename = "test_py.txt" lines = "madoka\nhomura\nmami\nsayaka\nkyoko" # Write f = Gio.file_new_for_path(filename) fstream = f.replace("", False, Gio.FileCreateFlags.NONE, None) dstream = Gio.DataOutputStream.new(fstream) dstream.put_string(lines, None) fstream.close(None) # Read f = Gio.file_new_for_path(filename) fstream = f.read(None) dstream = Gio.DataInputStream.new(fstream) while 1: text, length = dstream.read_line_utf8(None) if text == None: break print "{0}({1})".format(text, length) fstream.close(None)
Seed は基本的に NULL でいい引数は書く必要は無い、書いても結果は同じ。
Python は GCancellable を強要する、None で通常なら問題ない。
つか Python はやっぱりタプルを戻す、つまり Python なら length も取れる。
慣れていないと困惑するよなこの仕様。
DataInputStream の c_new って何だろう?
#!/usr/bin/env seed Gio = imports.gi.Gio; for (var s in Gio.DataInputStream) { Seed.print(s); } /* output type c_new prototype */
static 状態では prototype のメソッドを使えないということか。
そういうことなら new という名前でイイと思うが理由があるのだろう。
とりあえずこれだけ解れば小物スクリプト程度なら作れると思う。
どうでもいいけど。
var f = Gio.File.new_for_path(fn) var f = Gio.file_new_for_path(fn)
PyGI でも同じである、gi ってどっちでもいいんだね。