通过Microsoft.Scripting和IronPython运行Python
我可以创建Python脚本,并通过Visual Studio / .NET 4.0动态运行它们,像这样:
# testScript.py file:
import sys
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7.1\Lib')
import os
os.environ['HTTP_PROXY'] = "127.0.0.1:8888"
import urllib2
response = urllib2.urlopen("http://www.google.com")
然后在一个.NET 4.0的WinForms项目中:
ScriptEngine engine = Python.CreateEngine();
ScriptSource script = engine.CreateScriptSourceFromFile("testScript.py");
ScriptScope scope = engine.CreateScope();
script.Execute(scope);
不过,我导入的IronPython DLL文件并不包含所有的标准模块,所以我必须执行这个
import sys
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7.1\Lib')
步骤,这样我才能运行接下来的四行代码。
有没有什么方法可以避免这样做呢?
我打算发布这个应用程序,不想依赖每个人的机器上文件路径都一样!
2 个回答
4
如果你把Lib文件夹的副本放在包含你自己脚本的文件夹里,那么你可以使用IRONPYTHONPATH
这个环境变量来解决路径写死的问题。
在运行脚本之前,先设置好IRONPYTHONPATH
,
Environment.SetEnvironmentVariable("IRONPYTHONPATH", @"your_scripts\Lib");
ScriptEngine engine = Python.CreateEngine();
这样你就可以把脚本里的路径处理部分去掉了。
5
有一个扩展方法可以让你直接做到这一点:
ScriptEngine engine = Python.CreateEngine();
ScriptSource script = engine.CreateScriptSourceFromFile("testScript.py");
ScriptScope scope = engine.CreateScope();
engine.SetSearchPaths(new string[] { "C:\\Program Files (x86)\\IronPython 2.7.1\\Lib" });
script.Execute(scope);
最好是把标准库放在你应用的一个私有目录里,而不是依赖它已经被安装,这个决定权在你。