.NET에서 C# 코드로 Windows 환경변수 설정

pythonet 써보기 위해서 선행 설치할 것들을 모두 설치를 완료했습니다. (python 3.8.3, anaconda3)

참고로 python은 하나도 모릅니다. KoNLPy: 파이썬 한국어 NLP — KoNLPy 0.5.2 documentation 여기에 있는 데이터를 C#에서 사용하고 싶어서 이걸하고 있습니다.

pythonnet의 대문에 있는 예제소스를 보면 사용하기 전에

Embedding Python in .NET

  • You must set Runtime.PythonDLL property or PYTHONNET_PYDLL environment variable starting with version 3.0, otherwise you will receive TypeInitializationException. Typical values are python38.dll (Windows), libpython3.8.dylib (Mac), libpython3.8.so (most other *nix).
  • All calls to python should be inside a using (Py.GIL()) {/* Your code here */} block.
  • Import python modules using dynamic mod = Py.Import("mod"), then you can call functions as normal, eg mod.func(args).
  • Use mod.func(args, Py.kw("keywordargname", keywordargvalue)) or mod.func(args, keywordargname: keywordargvalue) to apply keyword arguments.
  • All python objects should be declared as dynamic type.
  • Mathematical operations involving python and literal/managed types must have the python object first, eg. np.pi * 2 works, 2 * np.pi doesn’t.

이라고 하면서 어떤 값을 설정하라고 하는데요. 찾아보니 그 방법이 아래와 같은 코드인 것 같습니다.

    class Program
    {
        static void Main(string[] args)
        {
            void AddEnvPath(params string[] paths)
            {
                // PC에 설정되어 있는 환경 변수를 가져온다.
                List<string> envPaths = Environment.GetEnvironmentVariable("PATH").Split(Path.PathSeparator).ToList();
                // 중복 환경 변수가 없으면 list에 넣는다.
                envPaths.InsertRange(0, paths.Where(x => x.Length > 0 && !envPaths.Contains(x)).ToArray());
                // 환경 변수를 재설정
                Environment.SetEnvironmentVariable("PATH", string.Join(Path.PathSeparator.ToString(), envPaths), EnvironmentVariableTarget.Process);
            }

            string pythonPath = @"C:\Users\user\anaconda3";
            string PYTHON_HOME = Environment.ExpandEnvironmentVariables(pythonPath);
            AddEnvPath(PYTHON_HOME, Path.Combine(PYTHON_HOME, @"Library\bin"));

            PythonEngine.PythonHome = PYTHON_HOME;
            //PythonEngine.PythonPath = @"C:\\Python38\\python.exe";
            PythonEngine.PythonPath = string.Join(Path.PathSeparator.ToString(), new string[] { PythonEngine.PythonPath });

            using (Py.GIL())
            {
                dynamic np = Py.Import("numpy");
                Console.WriteLine(np.cos(np.pi * 2));

                dynamic sin = np.sin;
                Console.WriteLine(sin(5));

                double c = np.cos(5) + sin(5);
                Console.WriteLine(c);

                dynamic a = np.array(new List<float> { 1, 2, 3 });
                Console.WriteLine(a.dtype);

                dynamic b = np.array(new List<float> { 6, 5, 4 }, dtype: np.int32);

                Console.WriteLine(b.dtype);

                Console.WriteLine(a * b);
                Console.ReadKey();
            }
        }
    }

소스는 명월 일지 :: [C#] Python을 사용하기 위한 방법(pythonnet) 여기에서 참조했습니다.
하지만 환경변수를 세팅하는 부분이 동작하지 않네요…
왜 이런걸까요…?

좋아요 1

Environment의
Set은 현재 프로세스 상에서 사용할 수 있는 환경 변수 입니다.

혹시 실제 OS상 환경 변수에 적용 되지 않는 다는 질문 이시라면

위 코드는 맞지 않습니다.

좋아요 1

대략 보니

3번째 파라메터에

EnvironmentVariableTarget.Process

가 아닌

EnvironmentVariableTarget.Machine

로 하시면 영구적으로 설정이 가능한 것 같기도 하네요 (관리자 권한과 시스템 재부팅이 필요할 수 도 있을거 같아요)

혹시 해당 문제점이 아니라면 다시 댓글 주세요

좋아요 1