无法从 C# 运行 Python 脚本,因为缺少 Pythonnet "encodings"模块



我试图通过使用现有的(和工作的)虚拟环境从c#内运行Python模块。我得到ModuleNotFoundError: No module named 'encodings',可能是由于错误加载Python DLL。

在执行Runtime.PythonDLL = @"C:UsersardiivaAppDataLocalProgramsPythonPython38python38.dll";时,我尝试了所有可能的订单组合。我注意到的是,python38.dll文件不存在于我的virtualenv文件夹下,所以我试图从我的本地windows机器用户安装Python复制它,但也试图直接引用它。venv是使用3.8.9 Python版本创建的。你知道吗?为什么我没有python.dll?它应该以某种方式生成吗?

var pathToVirtualEnv = @"C:rebrandingmanagerCFGRebrandingPythonManagercodicevenv";
Environment.SetEnvironmentVariable("PYTHONNET_PYDLL", @"C:UsersardiivaAppDataLocalProgramsPythonPython38python38.dll", EnvironmentVariableTarget.Process);
Runtime.PythonDLL = @"C:UsersardiivaAppDataLocalProgramsPythonPython38python38.dll";
var path = Environment.GetEnvironmentVariable("PATH").TrimEnd(';');
path = string.IsNullOrEmpty(path) ? pathToVirtualEnv : path + ";" + pathToVirtualEnv;
Environment.SetEnvironmentVariable("PATH", path, EnvironmentVariableTarget.Process);
Environment.SetEnvironmentVariable("PYTHONHOME", pathToVirtualEnv, EnvironmentVariableTarget.Process);            
Environment.SetEnvironmentVariable("PYTHONPATH", $"{pathToVirtualEnv}\Lib\site-packages;{pathToVirtualEnv}\Lib", EnvironmentVariableTarget.Process);            
//PYTHONNET_PYDLL 

PythonEngine.PythonHome = pathToVirtualEnv;
PythonEngine.PythonPath = Environment.GetEnvironmentVariable("PYTHONPATH", EnvironmentVariableTarget.Process);
PythonEngine.Initialize();
using (Py.GIL())
{
dynamic aaaa = Py.Import("TestPy.py");
aaaa.add_watermark("CIAOOOOO", "KAKAKAKAKAKAK.pdf", "RG-39119_002_A_001.pdf");
}

回溯为:

Exit code is 1 (Python path configuration:
PYTHONHOME = 'C:rebrandingmanagerCFGRebrandingPythonManagercodicevenv'
PYTHONPATH = 'C:rebrandingmanagerCFGRebrandingPythonManagercodicevenvLibsite-packages;C:rebrandingmanagerCFGRebrandingPythonManagercodicevenvLib'
program name = 'python'
isolated = 0
environment = 1
user site = 1
import site = 1
sys._base_executable = 'C:\Users\ardiiva\AppData\Local\JetBrains\Installations\Rider221\lib\ReSharperHost\TestRunner\net461\ReSharperTestRunner.exe'
sys.base_prefix = ''
sys.base_exec_prefix = ''
sys.executable = 'C:\Users\ardiiva\AppData\Local\JetBrains\Installations\Rider221\lib\ReSharperHost\TestRunner\net461\ReSharperTestRunner.exe'
sys.prefix = ''
sys.exec_prefix = ''
sys.path = [
'C:\rebrandingmanager\CFGRebrandingPythonManager\codice\venv\Lib\site-packages',
'C:\rebrandingmanager\CFGRebrandingPythonManager\codice\venv\Lib',
]
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'

使用dll时似乎没有设置标准PYTHONPATH。在我的情况下,我采取了dll目录(@"C:UsersardiivaAppDataLocalProgramsPythonPython38";在您的情况下),并将适当的文件夹添加到PythonEngine。使用函数:

string PythonPath(string pythonDir)
{
return $"{pythonDir};{pythonDir}\DLLs;{pythonDir}\Lib;{pythonDir}\Lib\site-packages";
}

然后:

string pythonPath = PythonPath(Path.GetDirectoryName(pythonDll) ?? ".");
PythonEngine.PythonPath += $";{pythonPath}";

对虚拟环境执行同样的操作:

string additional = PythonPath(pathToVirtualEnv);
PythonEngine.PythonPath +=  $";{additional}";

pathToVirtualEnv在哪里我.venv路径。

相关内容

最新更新