1

stackoverflow と python 2.7 doc を数日間検討した後、私はこれについて結論に達しませんでした。

基本的に、テキストブロックを入力する必要があるWindowsサーバーでpythonスクリプトを実行しています。このテキスト ブロックは (残念ながら)パイプで渡す必要があります何かのようなもの:

PS > [something_that_outputs_text] | python .\my_script.py

問題は次のとおりです。

サーバーは cp1252 エンコーディングを使用していますが、管理上の規制などにより変更できません。?そして、テキストをPythonスクリプトにパイプすると、それを読むと、文字が本来ある\xe1べきなのに、すでに付いています。

私がこれまでに行ったこと:

UTF-8 でテスト済み。うん、chcp 65001そして$OutputEncoding = [Console]::OutputEncoding「それを解決」してください。Pythonのように、テキストを完全に取得し、それをユニコードなどにデコードできます。

一体何が起こっているのかをテストするための小さなスクリプト:

import codecs
import sys

def main(argv=None):
    if argv is None:
        argv = sys.argv
        if len(argv)>1:
            for arg in argv[1:]:
                print arg.decode('cp1252')

    sys.stdin = codecs.getreader('cp1252')(sys.stdin)
    text = sys.stdin.read().strip()
    print text
    return 0

if __name__=="__main__":
    sys.exit(main())

codecsラッピングありとなしの両方で試してみました。

私の入力と出力:

PS > echo "Blá" | python .\testinput.py blé
blé
Bl?

--> したがって、引数 (blé) には問題はありませんが、パイプされたテキスト (Blá) は良くありません :(

私は文字列を16進数に変換しましたが、そうです、 (別名 mr )でtext溢れているので、.3f?print

[また: これは私の最初の質問です... 私が何をしたかについて、さらに詳しい情報をお気軽にお尋ねください]

編集

これが関連しているかどうかはわかりませんが、実行sys.stdin.encodingすると結果が得られますNone

更新:だから... cmdに問題はありません。cmdでプログラムを実行中にチェックsys.stdin.encodingしたところ、すべてうまくいきました。頭が爆発しただけだと思います。

4

1 に答える 1

0

データをファイルに保存し、CMD セッションで Python にパイプするのはどうですか? CMD で Powershell と Python を呼び出します。そのようです、

c:\>powershell -command "c:\genrateDataForPython.ps1 -output c:\data.txt"
c:\>type c:\data.txt | python .\myscript.py

編集

別のアイデア: Powershell でデータを base64 形式に変換し、Python でデコードします。Base64 は Powershell では簡単ですが、Pythonでも難しいことではないと思います。そのようです、

# Convert some accent chars to base64
$s  = [Text.Encoding]::UTF8.GetBytes("éêèë")
[System.Convert]::ToBase64String($s)
# Output:
w6nDqsOow6s=

# Decode:
$d  = [System.Convert]::FromBase64String("w6nDqsOow6s=")
[Text.Encoding]::UTF8.GetString($d)
# Output
éêèë
于 2013-09-27T04:45:07.347 に答える