Windows 7
Необходимо запустить внешнюю программу из Python.
Проблема 1. В пути к программе присутствуют русские символы.
Проблема 2. Программе нужно передать параметр-строку, которая представляет собой путь к другой папке (тоже с русскими символами).
Отчаянно гуглил по проблеме, накопал много инфы, пробовал по-всякому. Прошу, помогите её систематизировать и упорядочить, дабы решить проблему.
Что я понял.
1. Исходный код программы следует держать в UTF-8.
Для этого я вначале кода указал
# -*- coding: utf-8 -*-
ur"C:\Директория1\Директория2"
os.system(ur"C:\Директория1\Директория2\Приложение.exe")
Поэтому я много гуглил, использовал различные советы и в конечном счёте у меня получилась такая программа:
Вот весь код программы
# -*- coding: utf-8 -*-
import subprocess
import sys
import codecs
import os
# эту функцию я нагуглил на сайте хабрахабр, вроде она должна решать проблемы с кодировкой
def setup_console(sys_enc="utf-8"):
reload(sys)
try:
# для win32 вызываем системную библиотечную функцию
if sys.platform.startswith("win"):
import ctypes
enc = "cp%d" % ctypes.windll.kernel32.GetOEMCP() #TODO: проверить на win64/python64
else:
# для Linux всё, кажется, есть и так
enc = (sys.stdout.encoding if sys.stdout.isatty() else
sys.stderr.encoding if sys.stderr.isatty() else
sys.getfilesystemencoding() or sys_enc)
# кодировка для sys
sys.setdefaultencoding(sys_enc)
# переопределяем стандартные потоки вывода, если они не перенаправлены
if sys.stdout.isatty() and sys.stdout.encoding != enc:
sys.stdout = codecs.getwriter(enc)(sys.stdout, 'replace')
if sys.stderr.isatty() and sys.stderr.encoding != enc:
sys.stderr = codecs.getwriter(enc)(sys.stderr, 'replace')
except:
pass # Ошибка? Всё равно какая - работаем по-старому...
setup_console()
path = ur"C:\Директория1\Директория2\Приложение.exe"
path = os.path.normpath(path)
os.system("chcp 65001")
os.system(path)
Что получается в итоге: я получаю подобное сообщение в консоли (к счастью в корректной кодировке):
Active code page: 65001Также, если немного поэксперементировать с командой, меняя её, то выводится другое, но похожее сообщение:
The filename, directory name, or volume label syntax is incorrect.
Process finished with exit code 0
The system cannot find the path specifiedПри этом сама команда на 100% верная. Если я её просто копирую из кода и вставляю в консоль она нормально выполняется.
Из чего я делаю вывод, что из вышеприведенного кода консоль винды не может понять как раз таки русские символы в путях и это всё портит.
Подскажите, как добиться того, чтобы консоль понимала и русские символы тоже.