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

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

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

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

答案

这是基于@eryksun的评论。

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

C函数CreateProcessAspawnlsystempopen不起作用。

另一答案

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文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上处理文件名中带有回车的文件

在Windows上的python 2.7中列出具有Unicode名称的文件

如何在 python 中导入名称中带有空格的文件?

Beautifulsoup 无法找到名称中带有连字符的类

名称中带有分隔符的 db 上的 GRANT 不起作用

Anaconda/Python 站点包子文件夹名称中带有波浪号 - 它们是啥?