Кириллица в файловых путях при передаче cmd->mingw->python3
ОС Windows 10. Окружение mingw64+msys, из его же состава python3. Если программа на Python напрямую принимает во входных аргументах имя файла - нормально с ним работает и при наличии кириллицы в имени. Но запуск программы строится следующим образом: написан cmd/bat-скрипт для выставки переменных окружения и прочих настроек, в конце его вызов shell от msys c моим shell-скриптом в качестве аргумента и передачей туда же аргумента командной строки:
call "%~dp0\msys2_shell.cmd" -mingw64 /start.sh "%~1"
а в конце моего shell-скрипта start.sh
уже вызов питоновской программы с передачей того же аргумента командной строки:
python myprogram.py "$1"
При запуске cmd-скрипта с аргументом, именем файла, в питоновской программе при отсутствии на входе кириллицы всё работает как должно. Однако, если в имени входного файла была кириллица, в sys.argv[1]
получаем мусор на месте кириллицы, в юникодной уже строке. Соответственно, os.path.exists(sys.argv[1])
никакого файла не находит.
Команда chcp 65001
в начале cmd не помогает.
UPD
Если в shell-скрипте добавить строчку:
echo $1
то вместо кириллицы в msys-консоль также выведутся кракозябры. Думал, что shell ожидает utf8, а от cmd получает какую-то другую кодировку. Оказалось, наоборот, написал в shell-скрипте перекодирование из utf-8 в cp1251:
fname=`echo $1 | iconv -f utf-8 -t cp1251`
echo $fname
python myprogram.py "$fname"
и в консоли кириллица печатается нормально. Если далее из питона делать
print(sys.argv[1])
то тоже нормально, однако же os.path.exists(sys.argv[1])
в Питоне всё также не находит никакого файла.
Ответы (1 шт):
Решилось: при наличии кириллицы в имени файла строка в sys.argv[1]
приходит с ограничивающими кавычками в начале и в конце. Нет кириллицы - нет кавычек.
Итого, помогла перекодировка в shell-скрипте
fname=`echo $1 | iconv -f utf-8 -t cp1251`
и удаление кавычек в py:
sys.argv[1].replace('"', '')