从C++调用 Python 并访问通过 Anaconda 安装的软件包
Calling Python from C++ and accessing packages installed via Anaconda
我开发了一些Python代码,从我的基本Anaconda环境中对热设备进行建模。此代码使用某些包,例如numpy
,这些包已安装到该环境中。
我想将此代码与同一工作站(MS Windows 10 OS(上的商业热系统建模程序连接。程序/Python 接口通过编译成 DLL 的一些C++代码进行处理。 简化的代码段如下所示:
#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 脚本中调用函数。但是,我想运行的实际代码需要为安装到基本 Anaconda 环境中的上述几个包提供一些import
语句。尝试导入其中任何一个都会导致加载脚本时调用失败。 具体来说,该语句pModule = PyImport_Import(pName)
导致pModule == 'NULL'
为真。
我已经在PYTHONPATH
系统环境变量中包含我的关键 Anaconda 环境目录,包括:
C:ProgramDataAnaconda3
C:ProgramDataAnaconda3DLLs
C:ProgramDataAnaconda3Lib
C:ProgramDataAnaconda3DLibsite-packages
我还尝试在执行activate.bat base
命令后从CMD.exe
窗口启动调用程序,但包导入仍然导致失败。
有没有办法在PyImport_Import()
调用之前为C++代码中的调用过程激活我的 Anaconda 基础环境,以使模块正确导入?还是我只是需要放弃 Anaconda 的环境并在不使用环境的情况下重新安装 python 和所有需要的模块?
如果您尝试使用基本环境在 conda 中运行 python 脚本,请尝试以下操作,将 -V 替换为您的 python 脚本:
conda run -n base python -V
蟒蛇 3.7.6
在C++中,如果你能够运行一个 Python 脚本,你可以试试这个:
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,你可以试试这个:
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 -V', shell=True)
subprocess.run('c:\Users\iowahawk89\miniconda3\Scripts\conda.exe run -n base python hello.py', shell=True)
保存输出以供以后使用
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 版本。
- 在Ubuntu 16.04上安装Cilk时出现问题
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- C++:如何在CLion IDE中安装Boost
- 安装opencv失败-粘贴CMakeError.log的内容
- 在cygwin中测试新的boost安装时出现cpp错误
- 有人安装"IITB Simplecpp in mac"吗?
- 我可以在 Arduino 的库文件夹之外安装库吗?
- Mingw-64 在构建和安装后不会编译 openCV 代码
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- 安装 libc++ 时出现问题
- 安装MinGW后C++编译器不起作用?
- 介子复制/安装头文件到输出目录并保持文件夹结构
- 无法安装 R 包 "nloptr"(Ubuntu 16.04 上的 R3.6.2) - C++编译器问题
- 如何在 Ubuntu 上安装 OpenCV for C/C++
- 检查是否安装了 windows10 C++
- 查找带有 Anaconda cmake 前缀的 boost-python3
- 安装 psutil 和为 pypy 配置期间出错
- 从C++调用 Python 并访问通过 Anaconda 安装的软件包
- 在 Anaconda 中安装 enaml
- 无法安装已安装64位版本Anaconda的提升库