我在Windows上有文件t2ű.cmd
,其名称中带有重音字符,我想从Python 2代码中运行它。
如果我将文件名作为open(u't2\u0170.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),但它不是&# 39;能够找到文件。
这些不起作用,他们提出 UnicodeDecodeError:' ascii'编解码器无法编码字符u' \ u170' ... :
os.system(u't2\u170.cmd')
os.popen(u't2\u170.cmd')
os.spawnl(u't2\u170.cmd', u't2')
subprocess.call(u't2\u170.cmd')
subprocess.call(u'"t2\u170.cmd"')
subprocess.call([u't2\u170.cmd'])
在这个项目中,升级到Python 3是不可行的。
重命名文件是不可行的,因为这些文件可以在只读共享上具有任意(用户提供的)名称,并且目录名称也可以包含重音字符。
在C语言中,我会使用wsystem
中的wpopen
,wspawnl
或<process.h>
个函数。
最好是我正在寻找适用于标准Python模块的解决方案(无需安装软件包)。但我对任何解决方案都感兴趣。
我需要一个没有打开新窗口的解决方案。
最终我想将命令行参数传递给程序,参数将包含任意Unicode字符。
答案 0 :(得分:0)
这是基于@eryksun的评论。
我们需要调用系统调用CreateProcessW
或C函数wspawnl
,wsystem
或wpopen
。 Python 2没有内置任何可以调用这些函数的东西。在C中编写扩展模块或使用ctypes
调用函数可能是一种解决方案。
C函数CreateProcessA
,spawnl
,system
和popen
不起作用。
答案 1 :(得分:-1)
如pep 0263中所述,如果你想在python脚本中使用unicode字符,只需在脚本的开头添加一个# -*- coding: utf-8 -*-
(在她之后它就可以了 - 砰):
#!/bin/env python
# -*- coding: utf-8 -*-
import os
os.system('t2ű.cmd')
如果您仍然遇到问题,可以查看一些软件包,例如win-unicode-console。
现在应该可以直接使用,没有转义代码。