运行 名称中带有重音字符的 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.system
、os.popen
、os.spawnl
和 subprocess.call
(有和没有 shell ), 但找不到该文件。
这些不起作用,它们会引发 UnicodeDecodeError: 'ascii' codec can't encode character 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 中,我会在 <process.h>
.
中使用任何 wsystem
、wpopen
或 wspawnl
函数
最好我正在寻找一个与标准 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函数wspawnl
、wsystem
或wpopen
。 Python 2 没有内置任何可以调用这些函数的东西。用 C 编写扩展模块或使用 ctypes
调用函数可能是一种解决方案。
C 函数 CreateProcessA
、spawnl
、system
和 popen
不起作用。
我在 Windows 上有文件 t2ű.cmd
,其名称中有一个重音字符,我想 运行 它来自 Python 2 代码。
如果我将文件名作为 unicode
文字传递,则打开文件 (open(u't2\u0170.cmd')
) 有效,但 str
文字无效,因为 \u0170
不在Windows 的代码页。 (有关打开名称中带有重音字符的文件的更多信息,请参阅此问题:
运行 来自命令提示符的文件没有 Python 有效。
我尝试将 str
文字传递给 os.system
、os.popen
、os.spawnl
和 subprocess.call
(有和没有 shell ), 但找不到该文件。
这些不起作用,它们会引发 UnicodeDecodeError: 'ascii' codec can't encode character 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 中,我会在 <process.h>
.
wsystem
、wpopen
或 wspawnl
函数
最好我正在寻找一个与标准 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函数wspawnl
、wsystem
或wpopen
。 Python 2 没有内置任何可以调用这些函数的东西。用 C 编写扩展模块或使用 ctypes
调用函数可能是一种解决方案。
C 函数 CreateProcessA
、spawnl
、system
和 popen
不起作用。