/** * 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 #include namespace mindspore { namespace python_adapter { // python scoped env, should only have one scoped_ instance static std::shared_ptr 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(sys_path[i]); if (path_str == path) { is_exist = true; } } if (!is_exist) { (void)sys_path.attr("append")(path.c_str()); } } std::shared_ptr 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(); } } 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(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