我试图使用subprocess.call
从Iron python调用python 2.7脚本。
被调用的进程使用IronPython中不支持的导入,如scikit-learn
和requests
。
目前我正在尝试使用此命令调用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
运行它导致它失败的区别是什么?
由于
--- --- EDIT
我似乎无法导入encodings.idna:
ImportError:没有名为idna的模块
这非常非常奇怪......
打印sys.path
显示c:\\Python27\\Lib
在那里,而idna.py文件在编码目录中...如何导入不起作用???
---一个更多的编辑---
我找到了解决问题的方法 - 从python shell启动IronPython脚本 - 一切正常。我仍然不知道为什么从IronPython调用python 2.7解释器会干扰python 2.7内部模块... PYTHONPATH确实包含了这些模块的路径,所以我非常感谢任何洞察到幕后发生的事情。
答案 0 :(得分:3)
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
。