Я сейчас перевожу скрипт из Perl в Python3 (3.6.5). Is работает на Windows Server 2016. Сценарий создает командную строку с аргументами и выполняет созданную строку с subprocess.check_output
. Один из параметров аргумента называется -location:"my street"
. Местоположение может содержать специальные символы, такие как умлаут (äöß) или (ŠŠ).
Когда я запускаю скрипт Perl, специальные символы правильно передаются приложению. Когда я запускаю скрипт Python, специальные символы заменяются на вопросительные знаки в приложении. Я думаю, что вызываемому приложению нужна строка аргумента в кодировке UTF-8.
Скрипт Perl работает в режиме UTF-8
use UTF8;
binmode( STDOUT, ":utf-8" );
Скрипт Python создается с PyCharm, закодированным в UTF-8. и первая строка скрипта содержит
# -*- coding: utf-8 -*-
Я попытался несколько вещей установить кодировку UTF-8 для аргументов подпроцесса, но это не сработало. Я использовал procmon.exe
для сравнения вызова приложения между скриптами Perl и Python. Что я вижу, так это то, что командная строка, которая отображается для вызова подпроцесса Python в procmon, доступна для чтения. Работающий Perl не вызывает. Строка местоположения ищет скрипт perl в procmon выглядит следующим образом:
-location:"HQ/äöööStraße"
.
Код Perl выглядит следующим образом:
$command = "C:\\PROGRAM FILES\\Application\\bin\\cfg.exe"
$operand = "-modify -location:123á456ß99"
$result = `$command $operand`;
Код Python выглядиткак это:
# -*- coding: utf-8 -*-
import subprocess
result = subprocess.check_output(['C:\\PROGRAM FILES\\Application\\bin\\cfg.exe', "-modify", "-location:123á456ß99"], shell=False, stderr=subprocess.STDOUT)
Есть идеи, что я должен сделать, чтобы аргументы Python правильно передавались в приложение?