3

我试图从 Iron python 调用 python 2.7 脚本,使用subprocess.call. 调用的进程使用 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 环境运行这个脚本,它就可以正常工作。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 确实包含这些模块的路径,所以我非常感谢对幕后发生的事情的任何洞察。

4

1 回答 1

3

IronPython 不支持idnamodule可能使用的requests编码

idna编码从 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.

于 2013-04-25T11:39:16.370 回答