首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C++调用Python并访问通过Anaconda安装的包

从C++调用Python并访问通过Anaconda安装的包
EN

Stack Overflow用户
提问于 2020-06-23 10:28:11
回答 1查看 805关注 0票数 2

我已经开发了一些Python代码,用于在我的基本Anaconda环境中对热设备进行建模。这段代码使用了一些安装在该环境中的包,比如numpy

我想将此代码与同一工作站(MS Windows 10 OS)上的商业热力系统建模程序接口。程序/Python接口是通过编译成DLL的一些C++代码来处理的。简化的代码片段如下所示:

代码语言:javascript
复制
#include <Python.h>
scriptName = "PyScript"
functionName = "InterfaceFunction"

Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("import os");
PyRun_SimpleString("sys.path.append(os.getcwd())");

pName = PyUnicode_DecodeFSDefault(scriptName.c_str());
pModule = PyImport_Import(pName); // Here's where things go bad.
pFunc = PyObject_GetAttrString(pModule, functionName.c_str());
pValue = PyObject_CallObject(pFunc, NULL);

该接口用于在仅使用内置Python功能的简单Python脚本中调用函数。但是,我想要运行的实际代码需要一些import语句,用于安装到基本蟒蛇环境中的上述几个包。加载脚本时,尝试导入其中任何一个都会导致调用失败。具体地说,语句pModule = PyImport_Import(pName)会导致pModule == 'NULL'为真。

我已经在PYTHONPATH系统环境变量中包含了关键的Anaconda环境目录,包括:

代码语言:javascript
复制
C:\ProgramData\Anaconda3
C:\ProgramData\Anaconda3\DLLs
C:\ProgramData\Anaconda3\Lib
C:\ProgramData\Anaconda3D\Lib\site-packages

我还尝试在执行activate.bat base命令后从CMD.exe窗口启动调用程序,但包导入仍然导致失败。

PyImport_Import()调用之前,有没有办法在C++代码中为调用进程激活我的Anaconda基础环境,以便正确地导入模块?或者我只是需要放弃Anaconda的环境,并在不使用环境的情况下重新安装python和所有需要的模块?

EN

回答 1

Stack Overflow用户

发布于 2020-06-23 14:33:51

如果您正在尝试使用基本环境在conda中运行python脚本,请尝试以下操作,将-V替换为您的python脚本:

代码语言:javascript
复制
conda run -n base python -V

Python 3.7.6

在C++中,如果您能够运行python脚本,则可以尝试执行以下操作:

代码语言:javascript
复制
import subprocess
subprocess.run('c:\\Users\\iowahawk89\\miniconda3\\condabin\\conda.bat activate base && "c:\\Users\\iowahawk89\\miniconda3\\Scripts\\conda.exe" "list" && conda deactivate', shell=True)

subprocess.run('c:\\Users\\iowahawk89\\miniconda3\\Scripts\\conda.exe run -n base python hello.py', shell=True)

或者,如果你想直接在解释器中运行python,你可以尝试这样做:

代码语言:javascript
复制
subprocess.run('c:\\Users\\iowahawk89\\miniconda3\\Scripts\\conda.exe run -n base python -V', shell=True)

其他想法:

代码语言:javascript
复制
subprocess.run('c:\\Users\\iowahawk89\\miniconda3\\Scripts\\conda.exe run -n base python -V', shell=True)

subprocess.run('c:\\Users\\iowahawk89\\miniconda3\\Scripts\\conda.exe run -n base python hello.py', shell=True)

保存输出以供以后使用

代码语言:javascript
复制
output = subprocess.check_output(['c:\\Users\\iowahawk89\\miniconda3\\Scripts\\conda.exe', 'list', '-n', 'base'])
print('Have %d bytes in output' % len(output))
print(output)

output = subprocess.check_output(['c:\\Users\\iowahawk89\\miniconda3\\condabin\\conda.bat', 'activate', 'base'], shell=True)

在所有情况下,我都能够从我的conda环境中看到正确的python版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62526361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档