我正在使用批处理文件来运行带有命令行参数的python脚本。 (是的,我知道python可以单独执行此操作,但我想了解为什么这不起作用) 一个参数是带有变音符号的文件路径(ä,ü,ö)。如果我使用Windows控制台并使用键盘编写路径一切正常。如果我尝试使用批处理文件(run_script.bat)并使用os.path.exists(filepath)对其进行测试,则会失败。我读了很多关于编码和解码的东西,但仍然没有解决方案。
示例:
我编写了以下代码并将其保存到名为parsepath.py的python模块中:
import os
import sys
def main():
fn = sys.argv[1]
if os.path.exists(fn):
print os.path.basename(fn)
# file exists
else:
print 'Could not read path {}'.format(fn)
if __name__ == '__main__':
print 'starting'
main()
我创建了一个名为c:\täterätä的文件夹。 在Windows控制台上我输入 c:\ python27 \ python.exe c:\ path \ to \ parsepath.py“c:\täterätä”
这导致
starting
tõterõtõ
Umlautä在控制台中的外观不同,但我猜这也是浏览器和控制台之间的编码问题。 无论如何,这是有效的。
如果我把它放在批处理文件中
"C:\python27\python.exe" "C:\path\to\parsepath.py" "c:\täteräta"
并运行批处理文件它不起作用。
starting
Could not read path c:\t+±ter+±ta
似乎我必须以某种方式解码。我使用了一个显示编码的编辑器,并将批处理文件保存为“utf-8”。
我尝试用
修改parsepath.py...
fn = sys.argv[1]
fn = fn.decode('utf-8')
...
但没有运气。有错误信息。
在纯命令行上运行的其他编码也不能与批处理文件一起使用:
fn = fn.decode('mbcs')
批处理文件以某种方式更改了文件路径的字符,但我不知道以哪种方式。我发现cmd.exe的代码页是850.这也是sys.stdout.encoding所说的(cp850)。
如果我打印sys.argv,使用纯命令行输入的文件路径将是
['parsepath.py', 'c:\\t\xe4ter\xe4t\xe4']
如果我打印来自批处理文件的sys.argv中的文件路径:
['C:\\path\\to\\parsepath.py','c:\\t+\xf1ter+\xf1t+\xf1']
区别很明显:ä表示为\ xe4,但批处理文件产生+ \ xf1
???