【问题标题】:Running Python via Microsoft.Scripting & IronPython通过 Microsoft.Scripting 和 IronPython 运行 Python
【发布时间】:2012-02-04 19:15:11
【问题描述】:

我能够创建 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')

步骤以便我可以运行接下来的 4 行。

有什么办法可以避免这种情况吗?

我将发布应用程序,我不想依赖每个人机器上的文件路径都相同!

【问题讨论】:

    标签: .net python import module ironpython


    【解决方案1】:

    有一个扩展方法可以让你直接做到这一点:

    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 文件,或者是否有一个我可以包括的文件。
    • 不,您必须复制整个文件夹。 2.7.2 将包含 zipimport 所以你应该可以把它放在一个 zip 文件中,但我还没有尝试过。
    【解决方案2】:

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

    在运行脚本之前设置IRONPYTHONPATH

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

    然后您应该能够从 python 脚本中删除路径操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 2023-04-08
      • 2016-07-15
      • 1970-01-01
      • 2010-12-29
      相关资源
      最近更新 更多