2013-09-26 2 views
1

После нескольких дней обитания над stackoverflow и python 2.7 doc я не пришел к выводу об этом.Python pipe cp1252 строка от PowerShell до сценария python (2.7)

В основном я запускаю скрипт python на сервере Windows, который должен иметь в качестве входного блока текст. Этот блок текста (к сожалению) имеет, который должен пройти по трубе. Что-то вроде:

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

Так что проблема:

сервер использует кодировку CP1252, и я действительно не могу изменить его в связи с административными правилами и этажерки. И когда я нажимаю текст на свой скрипт python, когда я его читаю, он приходит уже с ?, тогда как символы типа \xe1 должны быть.

То, что я сделал до сих пор:

Испытано с UTF-8. Yep, chcp 65001 и $OutputEncoding = [Console]::OutputEncoding «решайте его», так как в python отлично получается текст, а затем я могу его декодировать в unicode и т. Д. Но, по-видимому, они не позволяют мне делать это на сервере/в печатном виде.

небольшой скрипт, чтобы проверить, что, черт возьми, происходит:

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? 

-> Таким образом, нет никаких проблем с аргументом (BLE), но централизованному текст (BLA) не годится :(

Я даже переоборудованный text строку в шестнадцатеричную и, да, она получает залита 3f (AKA мр ?), так что это не проблема с print.

[Кроме того: это мой первый вопрос здесь ... не стесняйтесь спрашивать больше информации о том, что я сделал]

EDIT

Я не знаю, если это уместно, или нет, но когда я do sys.stdin.encoding он дает None

Обновление: Итак ... У меня нет проблем с cmd. Проверено sys.stdin.encoding во время запуска программы на cmd, и все прошло хорошо. Я думаю, что моя голова просто взорвалась.

+0

Просто хочу добавить, что я пока, к счастью, данный сервер Linux и все не работает из хорошо с кодировками ... Нет более PowerShell головных болей. – orestes

ответ

0

Как сохранить данные в файл и передать его Python на сеанс CMD? Вызовите Powershell и Python на CMD. Как это так,

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

Редактировать

Другая идея: преобразовать данные в формат base64 в Powershell и декодировать его в Python.Base64 прост в Powershell, я думаю, в Python it isn't hard either. Как это так,

# 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 
éêèë 
+0

Сначала у меня была моя программа, работающая с файлами (мне также было полезно отслеживать, что я делаю). Но, к сожалению, мне сказали администраторы не делать этого (это больничный сервер ...). Но да, он отлично работает на CMD. Даже с простым примером «echo» Olá »| python. \ myscript.py'. ** Почему? ** – orestes

+0

@orestes, если администраторы обеспокоены безопасностью данных, как насчет записи в EFS-зашифрованную папку? В этом случае содержимое файла совершенно безопасно от посторонних глаз. Что касается части, проверьте [кодовая страница] (http://stackoverflow.com/a/9822905/503046) в [сеансе CMD] (http://stackoverflow.com/a/1259468/503046). – vonPryz

+0

ОК, вторая часть действительно помогла. Большое спасибо. Тем не менее, мне был предоставлен сервер Linux для работы на данный момент и отошел от неудобной кодировки cp1252 ;-) спасибо! – orestes

Смежные вопросы