如何将 virtualenv 添加到 Pythonnet 中?

Jos*_*dam 5 c# python virtualenv python.net

我无法加载在 C# 文件所在目录中使用 virtual-env 的虚拟环境。

这是我的代码

var eng = IronPython.Hosting.Python.CreateEngine();
var scope = eng.CreateScope();

// Load Virtual Env
ICollection<string> searchPaths = eng.GetSearchPaths();
searchPaths.Add(@"/Users/Desktop/CSharpProjects/demo1/.venv/lib");
searchPaths.Add(@"/Users/Desktop/CSharpProjects/demo1/.venv/lib/site-packages");
searchPaths.Add(AppDomain.CurrentDomain.BaseDirectory);
eng.SetSearchPaths(searchPaths);

string file = @"script.py";

eng.ExecuteFile(file, scope);
Run Code Online (Sandbox Code Playgroud)

未处理的异常。IronPython.Runtime.Exceptions.ImportException:没有名为“numpy”的模块

我可以在创建的 virtualenv 的终端上执行 Python 代码。

import numpy as np

def name(a, b=1):
    return np.add(a,b)
Run Code Online (Sandbox Code Playgroud)

更新:

看来IronPython3是相当无望了,我会接受Pythonnet中的实现!

这是我在 Pythonnet 上的当前代码,我正在使用 NuGet - Pythonnet prerelease 3.0.0-preview2022-06-27

以下工作正常,因为它使用 system@s python 3.7,但是我希望它使用位于C:\envs\venv2. 如何修改以下代码以使用位于的虚拟环境C:\envs\venv2

我的 class1.cs 是:

using Python.Runtime;
using System;
namespace ConsoleApp1
{
    public class PythonOperation
    {
        PyModule scope;

        public void Initialize()
    {
        Runtime.PythonDLL = @"C:\\Python37\python37.dll";


        string pathToVirtualEnv = @"C:\envs\venv2";
        string pathToPython = @"C:\Python37\";


        Environment.SetEnvironmentVariable("PATH", pathToPython, EnvironmentVariableTarget.Process);
        Environment.SetEnvironmentVariable("PYTHONHOME", pathToVirtualEnv, EnvironmentVariableTarget.Process);
        Environment.SetEnvironmentVariable("PYTHONPATH", $"{pathToVirtualEnv}\\Lib\\site-packages;{pathToVirtualEnv}\\Lib", EnvironmentVariableTarget.Process);

        PythonEngine.PythonHome = pathToVirtualEnv;
        PythonEngine.PythonPath = Environment.GetEnvironmentVariable("PYTHONPATH", EnvironmentVariableTarget.Process);
    

        PythonEngine.Initialize();
        scope = Py.CreateScope();
        PythonEngine.BeginAllowThreads();
        }

        public void Execute()
        {
            using (Py.GIL())
            {

            }}}}
Run Code Online (Sandbox Code Playgroud)

错误:

致命 Python 错误:initfsencoding:无法加载文件系统编解码器 ModuleNotFoundError:没有名为“encodings”的模块

Car*_*ani 1

您可能需要尝试以下设置方式PythonEngine.PythonPath

string pathToVirtualEnv = /path/to/venv/;

var path = Environment.GetEnvironmentVariable("PATH").TrimEnd(';');
path = string.IsNullOrEmpty(path) ? pathToVirtualEnv : path + ";" + pathToVirtualEnv;
Environment.SetEnvironmentVariable("PATH", path, EnvironmentVariableTarget.Process);
Environment.SetEnvironmentVariable("PATH", pathToVirtualEnv, EnvironmentVariableTarget.Process);
Environment.SetEnvironmentVariable("PYTHONHOME", pathToVirtualEnv, EnvironmentVariableTarget.Process);
Environment.SetEnvironmentVariable("PYTHONPATH", $"{pathToVirtualEnv}\\Lib\\site-packages;{pathToVirtualEnv}\\Lib", EnvironmentVariableTarget.Process);
            
            
PythonEngine.PythonHome = pathToVirtualEnv;
PythonEngine.PythonPath = PythonEngine.PythonPath + ";" + Environment.GetEnvironmentVariable("PYTHONPATH", EnvironmentVariableTarget.Process);
Run Code Online (Sandbox Code Playgroud)

正如您在上面看到的,您可以PythonPath在分配新值时进行引用。