Python for.NET:ImportError:没有名为warnings的模块

2024-10-01 07:33:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在.NET4.0中嵌入Python2.6。在

按照“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);

即使测试.py是空的,我得到一个导入错误,说“没有名为warnings的模块”。在

^{pr2}$

当你跑步的时候,原因就显而易见了测试.py使用“python-v”(详细模式)。请注意,python调用了#cleanup[2]警告。在

为什么Python.NET不能解析警告?该模块位于Lib目录中。在

有什么想法吗?在


Tags: 模块pathpynetvardirectorymodulepathpythonengine
3条回答

@SilentGhost我不知道你是否知道,但是你需要设置你的PYTHONPATH环境变量,而不是PYTHONHOME变量。一、 同样,如果有问题,用ol'设置环境变量环境.SetVariable(PYTHONPATH,…)最后一切都很顺利。在

祝你好运Python.NET. 在

我正在使用的是Python.NET我和Python3.6也有类似的问题。我在运行时设置环境变量的运气不太好,但我发现以下方法是有效的。在

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

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

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

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

确保在调用python引擎之前设置了PythonEngine.PythonPath变量。在

还需要重新启动visualstudio以查看任何系统变量更改在调试时生效。在

另外,我还发现需要将我的\Python36\Lib\site packages文件夹路径添加到PYTHONPATH中,以获取通过pip安装的任何内容。在

我认为默认情况下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,然后从代码中执行以下操作

^{pr2}$

相关问题 更多 >