Closed
Description
Very simple to reproduce:
In the Python.EmbeddingTests project (I am using master branch):
- Add reference to MSTest (Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll 10.0.0.0)
- Convert pyimport from NUnit to MSTest:
- remove NUnit Import, add using Microsoft.VisualStudio.TestTools.UnitTesting
- replace attributes with MStest attributes (TestClass, TestInitialise, TestCleanup, TestMethod)
- Running TestDottedName works as expected.
- Edit one.py and add
import numpy as np
as first line - Run TestDottedName should work first time
- Run TestDottedName again, now it fails with:
Test method Python.EmbeddingTest.PyImportTest.TestDottedName threw exception:
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
This error is also being shown in my ASP.Net Web API application on restart so I hope a solution will solve both MSTest and ASP.Net.
Further Information: Full version of pyimport.cs after edits is:
using System;
using System.Reflection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Python.Runtime;
namespace Python.EmbeddingTest
{
[TestClass]
public class PyImportTest
{
private IntPtr gs;
[TestInitialize]
public void SetUp()
{
string path = @"c:\dev\libs\Anaconda3\envs\python2;" + Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Machine);
Environment.SetEnvironmentVariable("PATH", path, EnvironmentVariableTarget.Process);
Environment.SetEnvironmentVariable("PYTHONHOME", @"c:\dev\libs\Anaconda3\envs\python2", EnvironmentVariableTarget.Process);
Environment.SetEnvironmentVariable("PYTHONPATH ", @"c:\dev\libs\Anaconda3\envs\python2\Lib", EnvironmentVariableTarget.Process);
PythonEngine.Initialize();
gs = PythonEngine.AcquireLock();
//string here = Environment.CurrentDirectory;
//trunk\pythonnet\src\embed_tests\bin\x86\DebugWin
/*
* Append the tests directory to sys.path
* using reflection to circumvent the private modifires placed on most Runtime methods.
*/
const string s = @"../../../../tests";
Type RTClass = typeof(Runtime.Runtime);
/* pyStrPtr = PyString_FromString(s); */
MethodInfo PyString_FromString = RTClass.GetMethod("PyString_FromString",
BindingFlags.NonPublic | BindingFlags.Static);
object[] funcArgs = new object[1];
funcArgs[0] = s;
IntPtr pyStrPtr = (IntPtr)PyString_FromString.Invoke(null, funcArgs);
/* SysDotPath = sys.path */
MethodInfo PySys_GetObject = RTClass.GetMethod("PySys_GetObject",
BindingFlags.NonPublic | BindingFlags.Static);
funcArgs[0] = "path";
IntPtr SysDotPath = (IntPtr)PySys_GetObject.Invoke(null, funcArgs);
/* SysDotPath.append(*pyStrPtr) */
MethodInfo PyList_Append = RTClass.GetMethod("PyList_Append", BindingFlags.NonPublic | BindingFlags.Static);
funcArgs = new object[] { SysDotPath, pyStrPtr };
int r = (int)PyList_Append.Invoke(null, funcArgs);
}
[TestCleanup]
public void TearDown()
{
PythonEngine.ReleaseLock(gs);
PythonEngine.Shutdown();
}
[TestMethod]
public void TestDottedName()
{
PyObject module = PythonEngine.ImportModule("PyImportTest.test.one");
Assert.IsNotNull(module, ">>> import PyImportTest.test.one # FAILED");
}
}
}
Metadata
Metadata
Assignees
Labels
No labels