运行 名称中带有重音字符的 cmd 文件,在 Python 2 Windows 中

running a cmd file with an accented character in its name, in Python 2 on Windows

我在 Windows 上有文件 t2ű.cmd,其名称中有一个重音字符,我想 运行 它来自 Python 2 代码。

如果我将文件名作为 unicode 文字传递,则打开文件 (open(u't2\u0170.cmd')) 有效,但 str 文字无效,因为 \u0170 不在Windows 的代码页。 (有关打开名称中带有重音字符的文件的更多信息,请参阅此问题:。)

运行 来自命令提示符的文件没有 Python 有效。

我尝试将 str 文字传递给 os.systemos.popenos.spawnlsubprocess.call(有和没有 shell ), 但找不到该文件。

这些不起作用,它们会引发 UnicodeDecodeError: 'ascii' codec can't encode character u'\u170'...:

在这个项目中,升级到 Python 3.

是不可行的

重命名文件是不可行的,因为这些文件在只读共享上可以具有任意(用户提供的)名称,而且目录名称可以包含重音字符。

在 C 中,我会在 <process.h>.

中使用任何 wsystemwpopenwspawnl 函数

最好我正在寻找一个与标准 Python 模块一起工作的解决方案(无需安装包)。但我对任何解决方案都感兴趣。

我需要一个不打开新 window 的解决方案。

最终我想将命令行参数传递给程序,并且参数将包含任意 Unicode 字符。

pep 0263中所述,如果您想在python脚本中使用unicode字符,只需在脚本开头添加一个# -*- coding: utf-8 -*-(在she-bang):

#!/bin/env python
# -*- coding: utf-8 -*-
import os

os.system('t2ű.cmd')

如果您仍然发现问题,您可以查看一些软件包,例如win-unicode-console

现在应该可以直接使用,没有转义代码。

这是基于@eryksun 的评论。

我们需要调用系统调用CreateProcessW或C函数wspawnlwsystemwpopen。 Python 2 没有内置任何可以调用这些函数的东西。用 C 编写扩展模块或使用 ctypes 调用函数可能是一种解决方案。

C 函数 CreateProcessAspawnlsystempopen 不起作用。