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で使っていきたいのですが、こういった開発環境にプラスαをしたこと自体初めてなため、
自力でどうすれば解決できるのかわからず、途方にくれています。
拙い質問ですが、解決方法をご教授頂けると、とても嬉しく思います。
No.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でした)
遅くなりましたが、
kmeeさんの回答を元に、jythonのライブラリにそもそも_codecs_jpというモジュールが無いのだと気づき、
それを元に今日、解決に至ることが出来ました。
本当にありがとうございました。
No.1
- 回答日時:
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以降では、標準で添付されてるとのことです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonをjupiter notebookからmecabで頻出の高い単語の抽出について(Runt 1 2022/12/17 18:08
- PHP eclipse pleiades phpのインストールについて 1 2023/02/03 17:15
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- その他(プログラミング・Web制作) Pythonの作業環境・作業フォルダの迅速な設定・指定方法 3 2022/04/01 07:55
- オープンソース Python openpyxlを使用したセル番地の使用について 1 2023/08/03 22:05
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの表にヘンな枠が・・・
-
pingは正常なのにtracerouteで...
-
SONYの音楽ソフト「x-アプリ」...
-
LD_LIBRARY_PATHって?
-
ROBOCOPY cmdで正常に処理され...
-
windows10のごみ箱をrd /s /q C...
-
taskkill をバッチ処理できない。
-
python IDLEで訂正、削除のやり...
-
postgres のコマンドが実行でき...
-
Macでlsした際の、ファイル名の...
-
コマンドプロンプト「システム...
-
sudoで実行したコマンドの実行...
-
windowsからtelnetでログインし...
-
Linux のシェルスクリプトの強...
-
CRONを隔週の日曜日に実行させたい
-
UbuntuにROSをインストールしたい
-
シャットダウンバッチがうまく...
-
linux でバッチファイを作成し...
-
最初の一度しか実行されないロ...
-
shutdownコマンド実行の残り時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SONYの音楽ソフト「x-アプリ」...
-
エクセルの表にヘンな枠が・・・
-
pingは正常なのにtracerouteで...
-
ファイルサイズが小さくなりま...
-
windows10のごみ箱をrd /s /q C...
-
LD_LIBRARY_PATHって?
-
バッチファイル内の各コマンド...
-
linuxサーバーのキャッシュをク...
-
最初の一度しか実行されないロ...
-
Linux のシェルスクリプトの強...
-
エクセルからアクセスのプロシ...
-
python IDLEで訂正、削除のやり...
-
SPI非言語の問題 解説お願いします
-
shutdownコマンド実行の残り時...
-
ROBOCOPY cmdで正常に処理され...
-
taskkill をバッチ処理できない。
-
Openイベントを開始させないで...
-
ACCESSレポートをPDFに出力したい
-
sudoで実行したコマンドの実行...
-
信頼済みサイト登録をbatファイ...
おすすめ情報