我已经开发了一些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脚本中调用函数。但是,我想要运行的实际代码需要一些import语句,用于安装到基本蟒蛇环境中的上述几个包。加载脚本时,尝试导入其中任何一个都会导致调用失败。具体地说,语句pModule = PyImport_Import(pName)会导致pModule == 'NULL'为真。
我已经在PYTHONPATH系统环境变量中包含了关键的Anaconda环境目录,包括:
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和所有需要的模块?
发布于 2020-06-23 14:33:51
如果您正在尝试使用基本环境在conda中运行python脚本,请尝试以下操作,将-V替换为您的python脚本:
conda run -n base python -VPython 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版本。
https://stackoverflow.com/questions/62526361
复制相似问题