forked from huawei/mindspore2022
94 lines
3.0 KiB
C++
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
|