アプリ版:「スタンプのみでお礼する」機能のリリースについて

Javaを独学で齧った程度で、特にPythonはつい最近知ったばかりのため、質問の仕方が的を射ていないかもしれませんが、質問が足りていなければ、補足したり、試しますので、お答え頂けると嬉しく思います。

使用しているmacは
MacBookPro,13-inch, Early 2011
MacOS 10.7.1
使用してるIDEはEclipseです。

JavaとJythonでやりとりをする際の文字コードについての質問です。

JVMで動くゲームを作ろうと思いまして、一番変更の多い部分にJythonを使ってみたく、
http://www.jython.org/downloads.htmlより、Jython 2.5.2をダウンロードし、指示に従って順繰りにインストールをしました。
その後、Javaプロジェクトを作成し、「外部アーカイブの追加」より、インストールした際に出来た、jython.jarを追加し、
また、EclipseでPyDevを入手し、設定の「Interpreter - Jython」には、同様のjython.jarを通しました。
Eclipseの環境設定→ワークスペース、のテキスト・ファイル・エンコードはデフォルトの(SJIS)になっています。
この環境で、JythonがJavaとどのようにやり取りするのか、色々と試そうと思ったのですが、
スクリプトの文頭に#coding:Shift_JIS、また#coding:SJISなどと入れ、

#coding:Shift_JIS
print "あああ"

という風にして、javaから

PythonInterpreter pi = new PythonInterpreter();
pi.execfile("script/test.py");

と言った形で呼び出すと、
Exception in thread "main" LookupError: unknown encoding 'shift_jis'
といったエラーが出てしまいます。
#coding:Shift_jisの下りを入れなかった場合は
Exception in thread "main" SyntaxError: Non-ASCII character in file 'script/test.py', but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
になります。

ただ、Eclipseの実行をスクリプトだけに焦点をあてている場合は(分りづらい書き方かと思いますが、スクリプトのファイルを選択した状態で実行をするという感じの場合は)、問題なく実行されます。#coding:Shift_JISを書かなければ、SyntaxErrorになります。"SJIS"でも同じでした。

日本語を使わなければ、pi.execfileで読んだり、execで関数を実行したり、
pythonから整数型や英数字のみの文字列を、javaのクラス変数やインスタンス変数に代入して、それをjavaから確認したりすることは出来ます。

また、インストールしたJythonのフォルダのある、User/ユーザ名/jython2.5.2/jython(UNIX実行ファイル)
をダブルクリックして出るターミナル画面から、

>>> unicode("ああああ","Shift_jis")

と入力しても、

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: unknown encoding 'shift_jis'

というエラーが出ます。
どうにかして日本語を、可能ならShift_JISで使っていきたいのですが、こういった開発環境にプラスαをしたこと自体初めてなため、
自力でどうすれば解決できるのかわからず、途方にくれています。
拙い質問ですが、解決方法をご教授頂けると、とても嬉しく思います。

A 回答 (2件)

ターミナルからpythonとして実行されるのは、俗にCPythonと呼ばれるCで書かれたPythonで、Jythonのではありません。



/Users/Home/jython2.5.2/Lib/encodings にファイルは存在するようなので、Jythonがそれを見付けられない、というのが原因と思われます。

import sys
print sys.path

としてライブラリ検索パスを調べて、そこに /Users/Home/jython2.5.2/Lib が含まれているかどうか、含まれていないなら、どこか置き場所としてよさそうな場所が無いか、調べてみてください。

この回答への補足

ご回答頂き、ありがとうございます。
解決には至れていませんが、ご教授頂いたことで大変見通しが良くなりました。

CPythonで、そのコマンドを入力した時のリストはとても数が多く、

['',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
'/Library/Python/2.7/site-packages']


一方Jythonでそのコマンドを入力した場合は、
わずか
['', '/Users/Home/jython2.5.2/Lib', '__classpath__', '__pyclasspath__/', '/Users/Home/jython2.5.2/Lib/site-packages']
でした。しかし、Libは含まれていました。


また問題であった、IDEのeclipseで、
そのコマンドのみのスクリプトを書きまして、スクリプトだけを実行したところ、
コンソール画面にはプロジェクトのパス+CPythonでのリストが表示されました。
javaプロジェクトから、このスクリプトを呼び出した場合には、
['/Users/Home/jython2.5.2/Lib', '__classpath__', '__pyclasspath__/']
となり、Jythonのパスになっていました。
ターミナルのJythonからや、Javaプロジェクト上からがダメで、Eclipseでスクリプトだけを実行した時上手くいったのも、
ご指摘のように、全てJythonのライブラリの認識に問題があるのかなと自分でも理解できました。

encordingsが読まれているかどうかについて、解決の役に立つかわかりませんが(自分でも何をやっているかよく分からないのですが)
入力補完機能の力を借りて適当にアクセスしてみました。

import encodings
print encodings.ascii

と言った形のスクリプトを、javaプロジェクト上から呼んだ場合は
<module 'encodings.ascii' from '/Users/Home/jython2.5.2/Lib/encodings/ascii$py.class'>
となり、読みこめてはいるのかなと思いました。

同様に
import encodings
print encodings.shift_jis
としますと

スクリプト単体実行では
<module 'encodings.shift_jis' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/shift_jis.pyc'>
と表示されますが、
javaプロジェクトからの呼び出しですと

Exception in thread "main" Traceback (most recent call last):
File "script/test.py", line 2, in <module>
print encodings.shift_jis
File "/Users/Home/jython2.5.2/Lib/encodings/shift_jis.py", line 7, in <module>
import _codecs_jp, codecs
ImportError: No module named _codecs_jp

と出ました(また、ターミナルからCPhythonを呼んで同様のことをすると、AttributeErrorでした)

補足日時:2011/09/17 21:59
    • good
    • 0
この回答へのお礼

遅くなりましたが、
kmeeさんの回答を元に、jythonのライブラリにそもそも_codecs_jpというモジュールが無いのだと気づき、
それを元に今日、解決に至ることが出来ました。
本当にありがとうございました。

お礼日時:2011/10/14 23:26

Jython そのものは使ったこと無いですが、ひとまずPythonの範囲でできることを。



> LookupError: unknown encoding 'shift_jis'

encodingには Pythonのライブラリ/encodings/コード名.py? というファイルが使われます。このディレクトリにないものは認識できません。
MacOS付属のだったら /usr/lib/python2.X/encodings の下です。Jython用はちょっとわかりません。
ここにshift_jis.py?が無いのでしょう。
Jythonのインストールガイドを読んで、ライブラリを入手するか、cp932等の代替できるコードを使うかしてください。

この回答への補足

回答いただき有難う御座います。
さっそくみてみたのですが、
/usr/lib/以下にはpython2.7と2.6と2.5があり、全てのencordingsにshift_jisと名のつくものは同じだけ有り、
shift_jis_2004.py、shift_jis_2004.pyc、shift_jis_2004.pyo、shift_jis.py、shift_jis.pyc、shift_jis.pyo、shift_jisx0213.py、shift_jisx0213.pyc、shift_jisx0213.pyoでした。
ターミナル上からpythonを実行して
>>> unicode("ああああ","Shift_JIS")
と入力すると
u'\u7e3a\u3085\u2260\u7e3a\u3085\u2260'
となり、エラーも無いようでした。

jythonのインストール先はホームディレクトリにしたのですが、その
/Users/Home/jython2.5.2/Lib/encodings
にはshift_jisと名がつくものとして、
shift_jis_2004.py、shift_jis.py、shift_jis$py.class、shift_jisx0213.py
の4つがあるようでした。

shift_jisはjython2.2.2以降では、標準で添付されてるとのことです。

補足日時:2011/09/17 17:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!