通过Microsoft.Scripting和IronPython运行Python

4

我能够创建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 DLLs并未包含所有标准模块,因此需要进行以下操作。
import sys
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7.1\Lib')

请按以下步骤操作,以便我可以运行接下来的4行:

有没有什么方法可以避免这种情况发生?

我将要发布这个应用程序,我不想依赖于所有人机器上的文件路径相同!

2个回答

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);

最好将stdlib与您的应用一起包含在一个私有目录中,而不是依赖于其已安装,但这取决于您。


谢谢!包含标准库是指复制整个“Lib”文件夹和所有相关的.py文件,还是有单个文件可以包含? - Chad
1
不,你必须复制整个文件夹。2.7.2将包括zipimport,所以你应该能够把它放在一个zip文件中,但我还没有尝试过。 - Jeff Hardy

4

如果您在包含自己脚本的目录中包含Lib目录的副本,则可以使用IRONPYTHONPATH环境变量来解决硬编码路径的问题。

在运行脚本之前设置IRONPYTHONPATH

Environment.SetEnvironmentVariable("IRONPYTHONPATH", @"your_scripts\Lib");
ScriptEngine engine = Python.CreateEngine();

然后你应该能够从Python脚本中去除路径操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接