Windows 10操作系统。mingw64+msys环境,来自自带的python3。如果 Python 程序直接接受文件名作为输入参数,即使名称中包含西里尔字母,它也可以正常工作。但启动程序的结构如下:编写一个 cmd/bat 脚本来设置环境变量和其他设置,最后它使用我的 shell 脚本作为参数从 msys 调用 shell,并在那里传递命令行参数:
call "%~dp0\msys2_shell.cmd" -mingw64 /start.sh "%~1"
在我的 shell 脚本的末尾start.sh有一个对 Python 程序的调用,传递相同的命令行参数:
python myprogram.py "$1"
当您在 Python 程序中运行带有参数、文件名的 cmd 脚本并且输入中没有西里尔字母时,一切都会按预期运行。但是,如果输入文件名包含西里尔字母,我们sys.argv[1]会在 Unicode 字符串中用垃圾代替西里尔字母。因此,os.path.exists(sys.argv[1])它没有找到任何文件。
chcp 65001cmd开头的命令没有帮助。
UPD
如果将以下行添加到 shell 脚本中:
echo $1
然后,msys 控制台还将显示 krakozyabry,而不是西里尔字母。我认为 shell 需要 utf8,并从 cmd 接收一些其他编码。事实证明,相反,我在 shell 脚本中编写了从 utf-8 到 cp1251 的转换:
fname=`echo $1 | iconv -f utf-8 -t cp1251`
echo $fname
python myprogram.py "$fname"
并且在控制台中正常打印西里尔字母。如果我们进一步从 python 中得到它
print(sys.argv[1])
这也很正常,但是os.path.exists(sys.argv[1])Python仍然找不到任何文件。