Кириллица в файловых путях при передаче 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 шт):

Автор решения: Artem

Решилось: при наличии кириллицы в имени файла строка в sys.argv[1] приходит с ограничивающими кавычками в начале и в конце. Нет кириллицы - нет кавычек.

Итого, помогла перекодировка в shell-скрипте

fname=`echo $1 | iconv -f utf-8 -t cp1251`

и удаление кавычек в py:

sys.argv[1].replace('"', '')
→ Ссылка