8

我正在尝试将 python 2.6 嵌入到 .NET 4.0 中。

遵循“Python for .NET”中的极简文档,我编写了一个相当简单的代码,如下所示:

 const string pythonModulePath = @"C:\Projects\PythonImport\PythonImport\test.py";
 Environment.SetEnvironmentVariable("PYTHONHOME", Path.GetDirectoryName(python
 ModulePath));

 PythonEngine.Initialize();

 var oldWorkingDirectory = Directory.GetCurrentDirectory();
 var currWorkingDirectory = Path.GetDirectoryName(pythonModulePath);

 Directory.SetCurrentDirectory(currWorkingDirectory);

 var pyPlugin = PythonEngine.ImportModule(Path.GetFileNameWithoutExtension(python
 ModulePath));
 if (pyPlugin == null)
 {
      throw new PythonException();
 }

 Directory.SetCurrentDirectory(oldWorkingDirectory);

即使 test.py 是空的,我也会收到一个导入错误,说“没有名为警告的模块”。

'import site' failed; use -v for traceback

 Unhandled Exception: Python.Runtime.PythonException: ImportError : No module nam
 ed warnings

当您使用“python -v”(详细模式)运行 test.py 时,原因就很明显了。请注意,python 调用 #cleanup[2] 警告。

为什么 Python .NET 无法解决警告?该模块存在于 Lib 目录中。

有任何想法吗?

4

3 回答 3

2

我认为默认情况下 Python 引擎不会自动设置您需要的路径。

http://www.voidspace.org.uk/ironpython/custom_executable.shtml 有一个嵌入 ironpython 的示例。看起来你错过了类似的东西

PythonEngine engine = new PythonEngine();
engine.AddToPath(Path.GetDirectoryName(Application.ExecutablePath));
engine.AddToPath(MyPathToStdLib);

除非我知道 Ironpython 安装在哪里以及是否安装,否则我更喜欢找到我需要的所有标准模块,将它们编译为 IPyStdLibDLL,然后从我的代码中执行以下操作

import clr
clr.addReference("IPyStdLib")
import site
于 2011-01-21T22:36:15.840 回答
1

@SilentGhost 我不知道你是否明白这一点,但你需要设置你的 PYTHONPATH 环境变量而不是你的 PYTHONHOME 变量。我也遇到了问题,使用 ol' Environment.SetVariable("PYTHONPATH", ...) 设置环境变量,最后一切顺利。

祝 Python.NET 好运。

于 2011-04-25T20:37:20.023 回答
1

我正在使用 Python 3.6 的 2.4 版本的 Python.NET,我遇到了类似的问题。我在运行时设置环境变量时运气不佳,但我发现以下方法有效。

我发现 Python.NET 正在获取静态PythonEngine.PythonPath变量中定义的文件夹中的所有包。如果您在 PYTHONPATH 系统变量中设置了其他目录,它也会包含这些目录。

要在运行时包含模块目录,您可以执行以下操作

PythonEngine.PythonPath =  PythonEngine.PythonPath + ";" + moduleDirectory;

using (Py.GIL())
{
    dynamic module = Py.Import("moduleName");
    ...etc
}

确保PythonEngine.PythonPath在对 python 引擎进行任何调用之前设置变量。

调试时还需要重新启动 Visual Studio 才能看到任何系统变量更改生效。

作为旁注,我还发现我的 \Python36\Lib\site-packages 文件夹路径需要添加到 PYTHONPATH 以获取通过 pip 安装的任何内容。

于 2018-09-18T17:03:25.757 回答