2012-03-22 11 views
2

Python 2.7.3rc2コードがIDE(Aptana Studio 3 with PyDev)でうまく動作するが、ダブルクリックするとクラッシュするという問題がある.pyファイルを作成するか、Windowsのコマンドラインから実行してみてください。Python unicodeはコマンドラインでクラッシュするが、IDEではクラッシュする

問題の行は、ユニコード文字を含む文字列をファイルに書き込もうとしているところです。 IDEはそれに問題はなく、Unicode文字でファイルを正しく書き込みます。コマンドラインのバージョンでは、特定の文字をエンコードできないという不満があります。

質問の根本は、IDEバージョンと、ユニコードファイルを正しく書き込むコマンドラインバージョンとの違いと、もう1つは違いますか?

理想的なソリューションは、IDEバージョンとまったく同じようにコマンドラインバージョンを使用する必要があります。


EDIT:申し訳ありませんが、私はそれは私が、文字列をファイルに書き込むために使用していたどのコマンド想定していたと思ったが、私は、Pythonに新たなんです。実際のコマンドは、f = open(path, 'w')でインスタンス化されたオブジェクトfで呼び出されたwrite()です。私はファイルに書きたい文字列を渡し、その文字列にはUnicode文字が含まれています。

完全なエラーメッセージは次のとおりです。ここで

Traceback (most recent call last): 
    File "writer.py", line 46, in <module> 
    write_listings(c, output_path) 
    File "writer.py", line 33, in write_listings 
    print name 
    File "c:\Python27\lib\encodings\cp437.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_map) 
UnicodeEncodeError: 'charmap' codec can't encode characters in position 21-26: character maps to <undefined> 

は、例えば文字列です:私はちょうどにリテラルその文字列を置くことができないので、 滑鐵盧安大略加拿大

は、残念ながら、私はトラブルSSCCEの作成を抱えています私がエンコーディングを宣言していないと不平を言っていないソースコードファイル。それはイライラしています - これはIDEからすべてを実行したときにうまく動作していましたが、現在はユニコードのウサギの穴に向かっています!

EDIT:Fredrikのおかげで、私は今SSCCEを作ることができます。ここでは、次のとおりです。コマンドラインから実行が、IDEからない

# -*- coding: utf-8 -*- 
str = u'滑鐵盧安大略加拿大' 
f = open('test', 'w') 
f.write(str) 
f.close() 

このSSCCEがクラッシュします。 なぜですか?

EDIT:私はEdward Loperが提案したいくつかの追加コードを追加して、PythonのバージョンがコマンドラインとIDEバージョンで同一であることを確認しました。ここで

は新しいコードです:IDEから実行したときにここで

# -*- coding: utf-8 -*- 
import sys 
print sys.version 
print open 
print open.__module__ 

str = u'滑鐵盧安大略加拿大' 
f = open('test', 'w') 
f.write(str) 
f.close() 

が出力されます。コマンドラインから実行するとき

2.7.3rc2 (default, Mar 18 2012, 22:59:27) [MSC v.1500 64 bit (AMD64)] 
<built-in function open> 
__builtin__ 

そして、ここでは、出力されます。

2.7.3rc2 (default, Mar 18 2012, 22:59:27) [MSC v.1500 64 bit (AMD64)] 
<built-in function open> 
__builtin__ 
Traceback (most recent call last): 
    File "test.py", line 9, in <module> 
    f.write(str) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128) 

私の意見では、まだ問題が解決されていない彼はIDEであり、コマンドラインではありません!

+2

[http://www.python.org/dev/peps/pep- 0263 /](http://www.python.org/dev/peps/pep-0263/)?ファイルの先頭に '# - * - coding:utf-8 - * - 'を追加してください –

+0

これは単なるファイルですか、あるいはUnicode文字を使ってコンソールに何かを書いていますか? IDEのコンソールは通常、Windowsコンソールとは異なるエンコーディングを使用します。 – Fenikso

+2

あまり役に立ちません。エラーを出したコマンドは何でしたか?そして、どのようなエラーメッセージが報告されましたか? – aitchnyu

答えて

1

Fenikso氏によると、ファイルに書き込む前に文字列をエンコードする必要があります。 file.write()がそれ自体をしないのは、あなたが使いたいエンコーディング(utf-8、utf-16など)を指定する必要があるからです。使用するエンコーディングを知っているストリームオブジェクトを作成し、それを自動的に適用できるPythonモジュール "codecs"があります。これはフェニッとが彼の2番目の例で使用しているものです。

あなたのコードがIDEではなくコマンドラインで動作する理由については、私の推測では、あなたのIDEが「デフォルトのエンコーディング」をデフォルト以外の値に設定していると思います。 IDEとコマンドラインの両方でこれを実行してみてください、それが異なる場合は以下を参照してくださいここで

>>> import sys 
>>> print sys.getdefaultencoding() 

は、いくつかの関連する情報があります:http://blog.ianbicking.org/illusive-setdefaultencoding.html

+0

上記の質問を編集して、SSCCEの出力を追加のコマンドとともに表示します。 Spoiler警告 - エラー以外は同じです。 – aardvarkk

+0

(これはデフォルトのエンコーディングで行う可能性があると思ったとき、私の答えの2番目の部分を修正しました) –

+0

これはチケットです! 'sys.getdefaultencoding()'はコマンドラインで 'ascii'、IDEで' utf-8'です。ドライブ上にあるこれらの 'site.py'ファイルと' sitecustomize.py'ファイルについては、実際には分かりませんが、IDEとは異なるカスタマイズを行っていることが間違いありません。問題が原因です。遠くに行くと問題の根本に辿り着けてくれてありがとう! – aardvarkk

3

明示的にファイルに書き込む前に、必要なエンコーディングで、あなたの文字列をエンコードする必要があります:あなたはまた、明示的に特定のエンコーディングでファイルを開くことができ

f.write(text.encode("cp1250", "replace")) # Czech Windows encoding, use your own 

または

f.write(text.encode("utf-8", "replace")) # UTF-8 

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 
import codecs 

x = "abcč" 
f = codecs.open("test.txt", "w", "utf-8", "replace") 
f.write(x) 
+0

だから、良いニュースは、これが問題を解決するということです。悪い知らせは、なぜこれがIDEを介して動作するのか、コマンドラインで動作しないのかまだ分かりません。ファイルに書き込むときに、誰もがテキストを明示的にエンコードしますか?もしそうなら、なぜf.write()自体はそれをしませんか? – aardvarkk

+0

IDEコンソールはシステムコンソールとは異なり、おそらく異なるエンコーディングを使用します。 Pythonはあなたの文字列を暗黙的にエンコードしようとし、システムコンソールの "間違った"エンコーディング(私の場合は "ascii")を選択しますが、Eclipseコンソール(私の場合は "utf-8" – Fenikso

+0

私は指定されたエンコーディングでファイルを開く方法で私の答えを更新しました。 – Fenikso

1

これは、特定のエンコーディングで作業する必要があるときに行う方法です。

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 
import codecs 
out = codecs.getwriter('utf-8')(sys.stdout) 
out.write('some åäö-string') 
+0

これは、上記のFeniksoの答えと非常によく似た、別の良いアプローチのようです。この場合も、クラッシュを解決する可能性はありますが、コンソールとIDEの実行でこのコードの変更が必要な理由はわかりません。 IDEからUTF-8のデフォルトエンコーディングを定義する何らかの環境変数があるか、またはファイルに書き込むときに何かがあるようですが、コンソールから実行するとASCIIを仮定していますか?それは可能ですか? – aardvarkk

関連する問題