【问题标题】:LookupError: unknown encoding: idna - only from subprocess.callLookupError:未知编码:idna - 仅来自 subprocess.call
【发布时间】:2013-04-26 18:00:28
【问题描述】:

我正在尝试使用subprocess.call 从 Iron python 调用 python 2.7 脚本。 调用的进程使用 IronPython 不支持的导入,例如 scikit-learnrequests

目前我正在尝试使用此命令调用 python 2.7 脚本:

sub_ret_val = subprocess.call("C:/Documents and Settings/avishay/workspace/BursaProject_V1_31/brainManager_toFile.py", shell = True, stderr = subprocess.STDOUT)

但我得到了:

LookupError:未知编码:idna

现在,如果我从 windows shell 或 eclipse pydev 环境运行此脚本,它可以正常工作。从 shell 运行它与从 subprocess.call 运行它导致它失败有什么区别??

谢谢

---编辑---

看来我也不能导入 encodings.idna :

ImportError: 没有名为 idna 的模块

这很奇怪... 打印sys.path显示c:\\Python27\\Lib在那里,idna.py文件在encodings目录下……怎么导入不行???

---再编辑---

我找到了解决问题的一种方法——从 python shell 启动 IronPython 脚本——一切正常。我仍然不知道为什么从 IronPython 调用 python 2.7 解释器会干扰 python 2.7 内部模块...... PYTHONPATH 确实包含这些模块的路径,所以我非常感谢任何关于幕后发生的事情的见解。

【问题讨论】:

  • 创建一个完整的最小代码示例来显示问题并发布完整的回溯,例如,将print u'abc'.encode('idna') 放入child.py 文件并从parent.py 调用它:import subprocess; subprocess.call([r'c:\Python27\python.exe', 'child.py'])。首先使用 CPython 运行 parent.py(以确保它按预期工作)然后使用 IronPython 运行 parent.py 并查看它是否会重现问题。
  • @J.F.Sebastian - 我无法按照您建议的方式重现错误。使用 IronPython 运行 parent.py 时效果很好...
  • 这意味着 CPython 2.7 发现“idna”编码很好。如果你从 parent.py 而不是 child.py 调用 brainManager_toFile.py 会发生什么?
  • hm... 也可以。似乎唯一的问题是从 Eclipse 运行它时。仍然不知道为什么,但我会放手..谢谢你

标签: python subprocess ironpython


【解决方案1】:

IronPython doesn't support idna encoding 可能是used by requests module

idna encoding is available since Python 2.3:

>>> u"яндекс.рф".encode('idna')
b'xn--d1acpjx3f.xn--p1ai'
>>> b'xn--d1acpjx3f.xn--p1ai'.decode('idna')
'яндекс.рф'

为避免对用于运行脚本的 python 产生歧义,请尝试明确指定 Python 可执行文件的路径:

from subprocess import STDOUT, check_output as qx

output = qx([r"c:\Python27\python.exe", r"c:\path\to\script.py"], stderr=STDOUT)

作为替代方案,您可以安装 pylauncher,以便能够在其 shebang 行中为 Python 脚本指定所需的 Python 版本,例如 #!python2.7

【讨论】:

  • 感谢您的回复。我试图明确指定可执行文件,但无济于事。我不明白为什么从 IronPython 运行应该使 python 2.7 在其 /Lib/encodings 文件夹中找不到 idna ..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 2019-03-06
  • 2019-04-08
  • 2016-05-12
  • 1970-01-01
相关资源
最近更新 更多