我有一个包含内容的Python文件:
import re
import urllib
class A(object):
def __init__(self, x):
self.x = x
def getVal(self):
return self.x
def __str__(self):
return "instance of A with value '%s'" % (self.getVal())
我还有一个简单的C#控制台项目,代码如下:
engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromFile("test.py");
ScriptScope scope = engine.CreateScope();
ObjectOperations op = engine.Operations;
source.Execute(scope); // class object created
object klaz = scope.GetVariable("A"); // get the class object
object instance = op.Call(klaz, "blabla waarde"); // create the instance
object method = op.GetMember(instance, "getVal"); // get a method
string result = (string)op.Call(method); // call method and get result (9)
Console.WriteLine("Result: " + result); //output: 'Result: blabla waarde'
(我从this stackoverflow querstion and answer得到了这个)
如果我省略了Python文件中的import urllib语句,一切正常。 (意思是它找到了re模块)
但是,只要我添加import urllib
或import urllib2
,我就会收到以下异常:
ImportException was unhandled
No module named urllib
所以它以某种方式无法找到urllib。我检查了IronPython lib文件夹,urllib和urllib 2肯定都存在。
当我在C#代码中导入urllib时,会抛出相同的异常。 (engine.ImportModule("urllib");
)
任何想法?
我想管理python代码中的导入,而不是C#代码
(所以我想避免这样的事情:engine.ImportModule("urllib");
)
修改
关于我实际将要使用它的一些额外信息(也许有人有另一种选择):
我将有一个主要的C#应用程序,python脚本将用作主应用程序的扩展或插件
我正在使用Python,因此我不需要编译任何插件。
答案 0 :(得分:4)
我相信来自交互式控制台的'lib'在sys.path上实际上是在ipy.exe中完成的 - 当嵌入时你必须手动添加路径。引擎或运行时都有一个'SetSourcePaths'(或类似的)方法,允许你这样做。
答案 1 :(得分:1)
我面临同样的问题。按照“Tom E's”的建议,在对fuzzyman的回复的评论中,我可以成功地解决问题。问题似乎是它无法解析urllib.py的位置。我们需要设置它。
您可以查看以下link的问题和答案。
答案 2 :(得分:0)
您要导入的CPython版本必须与您的IronPython版本匹配。将CPython v2.5用于IronPython 2.0,或将v2.6用于IronPython 2.6。
试试这个:
import sys
sys.path.append(r'\c:\python26\lib') # adjust to whatever version of CPython you have installed.
import urllib