在C#运行py脚本时出现"No module named fcntl",但在Windows命令行中正常工作
我在调用一个使用了imaplib.py的Python脚本时,遇到了“没有名为fcntll的模块”的错误。通过搜索我发现,这个模块只在Unix系统中可用,所以我在想这个Python脚本是不是搞混了它运行的操作系统。再说了,这个脚本在Windows系统下直接从Python目录运行是没问题的。
var engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
var ops = engine.Operations;
var script = engine.CreateScriptSourceFromFile("PyTest.py");
CompiledCode code = script.Compile();
//string scode = script.GetCode();
code.Execute(scope);
这是一个最简单的Python脚本,用来引发这个错误。注意,如果把导入imaplib.py的那一行注释掉,错误就不会出现了。
import sys
sys.path = ["Python\Lib"]
sys.platform = ["win32"]
import os
import os
import getopt
import getpass
import time
import imaplib
我稍微追踪了一下,发现imaplib.py使用了subprocess.py,在那里我注意到了sys.platform这个变量,并尝试把它设置为win32,但没有任何变化。看起来IronPython的调用环境和从CPython文件夹的Windows命令提示符之间有些不同。
2 个回答
微软的版本默认情况下不会加载标准库。
你需要在代码中设置路径才能访问它。
最简单的方法是创建一个叫“IRONPYTHONPATH”的环境变量,这个变量里要包含IronPython安装目录下Lib文件夹的路径。
一旦你创建了这个环境变量,就可以像下面这样读取它的位置:
from System import Environment
pythonPath = Environment.GetEnvironmentVariable("IRONPYTHONPATH")
import sys
sys.path.append(pythonPath)
更多详细信息可以查看这里。 http://www.ironpython.info/index.php/Using_the_Python_Standard_Library
首先,你把 sys.platform
设置成了一个列表,但它应该是一个字符串。不过,.NET/CLI 和 Win32 是不同的平台,所以仅仅设置 sys.platform
是没用的。
通过一些搜索发现,IronPython 似乎不支持 subprocess
模块(或者说这个模块不支持 IronPython)。这里有一个部分替代方案:http://www.ironpython.info/index.php?title=The_subprocess_module
还有一个关于这个问题的错误报告和一些讨论在这里:http://bugs.python.org/issue8110