【发布时间】:2017-09-03 21:07:40
【问题描述】:
我在 Windows 上有文件 t2ű.cmd,其名称中有一个重音字符,我想从 Python 2 代码运行它。
如果我将文件名作为 unicode 文字传递,则打开文件 (open(u't2\u0170.cmd')) 有效,但 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(无论有无外壳),但它无法找到该文件。
这些不起作用,它们会引发 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 模块的解决方案(无需安装包)。但我对任何解决方案都感兴趣。
我需要一个不打开新窗口的解决方案。
最终我想将命令行参数传递给程序,参数将包含任意 Unicode 字符。
【问题讨论】:
-
尝试改用
os.startfile,查看 Python 源代码 (2.7.14rc1),在我看来它支持 Unicode 字符串。如果做不到这一点,我想你可以使用 ctypes 显式调用 CreateProcessW。 -
@HarryJohnston,这可能就足够了,因为看起来 pts 不需要命令行参数。另请注意,
os.startfile不会等待获取退出代码,它会创建一个新的控制台,该控制台将在批处理脚本退出后立即销毁。否则,选项是使用 ctypes (如您所说)或创建扩展模块。 PyWin32 的win32process模块在这里没有用,因为它也在 Python 2 中调用CreateProcessA。 -
感谢您对
os.startfile、win32process和CreateProcessW的澄清。看起来没有什么现成的可用(除了使用ctypes手动编码),它在 Python 2 中调用CreateProcessW。如果你写一个关于这个的答案,我会接受它。
标签: windows unicode python-2.x popen