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

时间:2017-09-03 21:07:41

标签: windows unicode python-2.x popen

我在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.systemos.popenos.spawnlsubprocess.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中的wpopenwspawnl<process.h>个函数。

最好是我正在寻找适用于标准Python模块的解决方案(无需安装软件包)。但我对任何解决方案都感兴趣。

我需要一个没有打开新窗口的解决方案。

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

2 个答案:

答案 0 :(得分:0)

这是基于@eryksun的评论。

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

C函数CreateProcessAspawnlsystempopen不起作用。

答案 1 :(得分:-1)

pep 0263中所述,如果你想在python脚本中使用unicode字符,只需在脚本的开头添加一个# -*- coding: utf-8 -*-(在她之后它就可以了 - 砰):

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

os.system('t2ű.cmd')

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

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