通过Microsoft.Scripting和IronPython运行Python

4 投票
2 回答
3194 浏览
提问于 2025-04-17 12:20

我可以创建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);

最好是把标准库放在你应用的一个私有目录里,而不是依赖它已经被安装,这个决定权在你。

撰写回答