【问题标题】:python os.popen fails when given umlauted characterpython os.popen 在给定变音字符时失败
【发布时间】:2011-12-02 11:34:21
【问题描述】:

在 winxp(pro x64 版本 2003,sp2)下,在 cmd 提示符下运行以下命令可以正常工作:

dir C:\testüüüdirectory\

请注意“ü”字符。

但是从python 2.7.1.4开始,下面总是返回错误码1:

>>> res = os.popen("dir C:\\testüüüdirectory\\")
>>> res.close()
1
>>>

我怎样才能接受 ü 字符?

【问题讨论】:

  • 你为什么用os.popen而不是subprocess
  • 什么版本的 Python?什么版本的windows?我没有得到1 我得到255res.closedFalse,直到我关闭它,而res.errorsNone,直接复制它。你在 Python 源文件中声明了什么编码?
  • winxp pro x64 2003 sp2,python 2.7.14。我在 repl 上这样做,所以我假设它在猜测 cmd 终端编码。
  • @phihag subprocess.Popen 也不起作用

标签: python windows popen


【解决方案1】:

试试在字符串前面加上u

 res = os.popen(u"dir C:\\testüüüdirectory\\")

More on unicode strings / lexical analysis

还要检查sys.getfilesystemencoding 以确保您可以拥有这样的文件名。

【讨论】:

    【解决方案2】:

    这可能是一个编码问题,您的输入与文件系统对输出的期望不完全匹配。首先,你需要告诉 Python 你的输入使用什么编码,然后popen() 调用需要什么编码。

    >>> filename = "C:\\testüüüdirectory\\".decode("utf-8")
    >>> res = os.popen("dir " + filename.encode("cp1252"))
    

    您可能需要尝试各种编码组合才能获得正确的配对。 UTF-8、UTF-16 和 cp1252 最有可能适用于 Windows,但您的系统可能设置为使用 another encoding。如果你真的很幸运,os.popen() 甚至可能接受一个 Unicode 字符串,在这种情况下可以跳过encode() 步骤。

    如果你真的不走运,character canonicalization 可能是个问题。 Unicode 中有两种可能的“ü”表示:U+00FC 或 U+0075 U+0308;第二个是带有组合分叉的“u”,而第一个是预先组合的。如果 Windows 需要一个,而 encode() 产生另一个,您可能需要做一些工作才能得到正确的字符串。

    【讨论】:

    • 谢谢。不过,这让我变成了一只悲伤的熊猫 :( 到目前为止还没有弄清楚神奇的组合。可能会更幸运地说服我的欧洲客户停止使用他们珍贵的变音符号 :D
    • 请记住,像这样对编码进行硬编码会使它依赖于操作系统,如果您必须在不同的设置上运行它,就会成为一个问题。
    • @DecioLira:好点。 decode() 调用仅依赖于文件的编码(或终端,在交互式提示下),并且可以用 u"" 替换为文件级编码标记或 \u0000 转义。 encode() 调用应该像 chown 建议的那样使用 sys.getfilesystemencoding()
    猜你喜欢
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2019-01-31
    • 1970-01-01
    • 2014-08-25
    • 2011-01-21
    相关资源
    最近更新 更多