在Windows上的Python 2中运行名称中带有重音字符的cmd文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Windows上的Python 2中运行名称中带有重音字符的cmd文件相关的知识,希望对你有一定的参考价值。
我在Windows上有文件t2ű.cmd
,其名称中带有重音字符,我想从Python 2代码运行它。
打开文件(open(u't2u0170.cmd')
)如果我将文件名作为unicode
文字传递,但没有str
文字可以工作,因为u0170
不在Windows的代码页上。 (有关打开名称中带有重音字符的文件的更多信息,请参阅此问题:opening a file with an accented character in its name, in Python 2 on Windows。)
在没有Python的情况下从命令提示符运行该文件。
我尝试将str
文字传递给os.system
,os.popen
,os.spawnl
和subprocess.call
(有和没有shell),但它无法找到该文件。
这些不起作用,它们引发了UnicodeDecodeError:'ascii'编解码器不能编码字符u' u170'...:
os.system(u't2u170.cmd')
os.popen(u't2u170.cmd')
os.spawnl(u't2u170.cmd', u't2')
subprocess.call(u't2u170.cmd')
subprocess.call(u'"t2u170.cmd"')
subprocess.call([u't2u170.cmd'])
在这个项目中,升级到Python 3是不可行的。
重命名文件是不可行的,因为这些文件可以在只读共享上具有任意(用户提供的)名称,并且目录名称也可以包含重音字符。
在C中我将使用wsystem
中的任何wpopen
,wspawnl
或<process.h>
函数。
我最好找一个适用于标准Python模块的解决方案(无需安装软件包)。但我对任何解决方案都感兴趣。
我需要一个不打开新窗口的解决方案。
最终我想将命令行参数传递给程序,参数将包含任意Unicode字符。
这是基于@eryksun的评论。
我们需要调用系统调用CreateProcessW
或C函数wspawnl
,wsystem
或wpopen
。 Python 2没有内置任何可以调用这些函数的东西。在C中编写扩展模块或使用ctypes
调用函数可能是一种解决方案。
C函数CreateProcessA
,spawnl
,system
和popen
不起作用。
如pep 0263中所述,如果你想在python脚本中使用unicode字符,只需在脚本的开头添加一个# -*- coding: utf-8 -*-
(在she-bang之后它就可以了):
#!/bin/env python
# -*- coding: utf-8 -*-
import os
os.system('t2ű.cmd')
如果您仍然遇到问题,可以查看一些软件包,例如win-unicode-console。
它现在应该直接工作,没有转义代码。
以上是关于在Windows上的Python 2中运行名称中带有重音字符的cmd文件的主要内容,如果未能解决你的问题,请参考以下文章