mindspore2022/mindspore/ccsrc/utils/python_adapter.cc

94 lines
3.0 KiB
C++

/**
* Copyright 2019 Huawei Technologies Co., Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "include/common/utils/python_adapter.h"
#include <memory>
#include <string>
namespace mindspore {
namespace python_adapter {
// python scoped env, should only have one scoped_ instance
static std::shared_ptr<py::scoped_interpreter> scoped_ = nullptr;
// true: start process from python, false: start process from c++
static bool python_env_ = false;
static bool use_signature_in_resolve_ = true;
void ResetPythonScope() { scoped_ = nullptr; }
void set_use_signature_in_resolve(bool use_signature) noexcept { use_signature_in_resolve_ = use_signature; }
bool UseSignatureInResolve() { return use_signature_in_resolve_; }
void set_python_env_flag(bool python_env) noexcept { python_env_ = python_env; }
bool IsPythonEnv() { return python_env_; }
void SetPythonPath(const std::string &path) {
// load the python module path
(void)python_adapter::set_python_scoped();
py::module sys = py::module::import("sys");
py::list sys_path = sys.attr("path");
// check the path is exist?
bool is_exist = false;
for (size_t i = 0; i < sys_path.size(); i++) {
std::string path_str = py::cast<std::string>(sys_path[i]);
if (path_str == path) {
is_exist = true;
}
}
if (!is_exist) {
(void)sys_path.attr("append")(path.c_str());
}
}
std::shared_ptr<py::scoped_interpreter> set_python_scoped() {
// if start process from python, no need set the python scope.
if (!python_env_) {
if ((Py_IsInitialized() == 0) && (scoped_ == nullptr)) {
scoped_ = std::make_shared<py::scoped_interpreter>();
}
}
return scoped_;
}
// return the module of python
py::module GetPyModule(const std::string &module) {
if (!module.empty()) {
return py::module::import(module.c_str());
} else {
return py::none();
}
}
// Get the obj of attr
py::object GetPyObjAttr(const py::object &obj, const std::string &attr) {
if (!attr.empty() && !py::isinstance<py::none>(obj)) {
if (py::hasattr(obj, attr.c_str())) {
return obj.attr(attr.c_str());
}
MS_LOG(DEBUG) << "Obj have not the attr: " << attr;
}
return py::none();
}
py::object GetPyFn(const std::string &module, const std::string &name) {
(void)python_adapter::set_python_scoped();
if (!module.empty() && !name.empty()) {
py::module mod = py::module::import(module.c_str());
py::object fn = mod.attr(name.c_str());
return fn;
}
return py::none();
}
} // namespace python_adapter
} // namespace mindspore