int CPython::ExecCmds(const std::wstring &cmds, std::wstring &err, HANDLE hfile) { int id = 0; FILE *pfile = nullptr; DWORD count = 0; PyObject *poldout, *polderr, *pnewout, *pnewerr; if (cmds.length() <= 0) { err = text("No python command found"); return 1; } if (DuplicateHandle ( GetCurrentProcess(), hfile, GetCurrentProcess(), &hfile, 0, false, DUPLICATE_SAME_ACCESS )) { id = open_osfhandle((intptr_t)hfile, _O_WRONLY); pfile = fdopen(id,"w"); setvbuf(pfile,nullptr,_IONBF,1024); poldout = PySys_GetObject("stdout"); polderr = PySys_GetObject("stderr"); pnewout = PyFile_FromFile(pfile, "logger", "w", nullptr); pnewerr = PyFile_FromFile(pfile, "logger", "w", nullptr); PySys_SetObject("stdout", pnewout); PySys_SetObject("stderr", pnewerr); } else poldout = polderr = pnewout = pnewerr = nullptr; std::wstring_convert<std::codecvt_utf8_utf16<wchar>> cvt; std::string str = cvt.to_bytes(cmds); int irslt = PyRun_SimpleString(str.c_str()); if (irslt != 0) err = text("Internal error that PyRun_SimpleString fail"); else err = text("Execute python commands successfully .."); if (pnewout != nullptr) PySys_SetObject("stdout", poldout); if (pnewerr != nullptr) PySys_SetObject("stderr", polderr); if (pfile != nullptr) fclose(pfile); return irslt; }
int CPython::ExecFile(const std::vector<std::wstring> &argv, std::wstring &err, HANDLE hfile) { int id = 0; FILE *pfile = nullptr; DWORD count = 0; PyObject *poldout, *polderr, *pnewout, *pnewerr; if (argv.size() <= 0) { err = text("No python script file found"); return 1; } if (DuplicateHandle ( GetCurrentProcess(), hfile, GetCurrentProcess(), &hfile, 0, false, DUPLICATE_SAME_ACCESS )) { id = open_osfhandle((intptr_t)hfile, _O_WRONLY); pfile = fdopen(id,"w"); setvbuf(pfile,nullptr,_IONBF,1024); poldout = PySys_GetObject("stdout"); polderr = PySys_GetObject("stderr"); pnewout = PyFile_FromFile(pfile, "logger", "w", nullptr); pnewerr = PyFile_FromFile(pfile, "logger", "w", nullptr); PySys_SetObject("stdout", pnewout); PySys_SetObject("stderr", pnewerr); } else poldout = polderr = pnewout = pnewerr = nullptr; // Pack up the arguments .. std::vector<char*> args; int irslt = 0; std::vector<std::wstring>::const_iterator itr, eitr; std::wstring_convert<std::codecvt_utf8_utf16<wchar>> cvt; itr = argv.cbegin(); eitr = argv.cend(); for (size_t len = 0; itr != eitr; ++itr) { // Allocate buffer each time, not good .. std::string str = cvt.to_bytes(*itr); len = str.length(); char *arg = new char[len+1]; strncpy_s(arg,len+1,str.data(),len); arg[len] = '\0'; args.push_back(arg); } PySys_SetArgv(args.size(), args.data()); // pass args . PyObject *pobj = PyFile_FromString(args.at(0), "r"); if (pobj == nullptr) { err = text("Internal error that PyFile_FromString fail"); irslt = -1; } else { PyRun_SimpleFileEx(PyFile_AsFile(pobj), args.at(0), true); err = text("Execute python script file successfully .."); irslt = 00; } // Free resource ... std::vector<char*>::iterator sitr, seitr; sitr = args.begin(); seitr = args.end(); for (sitr; sitr != seitr; ++sitr) { if (*sitr) delete [] *sitr; } args.clear(); if (pnewout != nullptr) PySys_SetObject("stdout", poldout); if (pnewerr != nullptr) PySys_SetObject("stderr", polderr); if (pfile != nullptr) fclose(pfile); return irslt; }
int CPython::ExecFunc(const std::vector<std::wstring> &argv, std::wstring &err, HANDLE hfile) { std::vector<std::wstring>::const_iterator itr, eitr; itr = argv.cbegin(); eitr = argv.cend(); err = *itr; if (argv.size() <= 0) { err = text("No python command function found"); return 1; } err.push_back(text('(')); for (++itr; itr != eitr; ++itr) { err.append(*itr); err.push_back(text(',')); } if (err.back() == text(',')) err.pop_back(); err.push_back(text(')')); Addtolist(1,1,text("Execute Function: %s"),err.c_str()); int id = 0; FILE *pfile = nullptr; DWORD count = 0; PyObject *poldout, *polderr, *pnewout, *pnewerr; if (DuplicateHandle ( GetCurrentProcess(), hfile, GetCurrentProcess(), &hfile, 0, false, DUPLICATE_SAME_ACCESS )) { id = open_osfhandle((intptr_t)hfile, _O_WRONLY); pfile = fdopen(id,"w"); setvbuf(pfile,nullptr,_IONBF,1024); poldout = PySys_GetObject("stdout"); polderr = PySys_GetObject("stderr"); pnewout = PyFile_FromFile(pfile, "logger", "w", nullptr); pnewerr = PyFile_FromFile(pfile, "logger", "w", nullptr); PySys_SetObject("stdout", pnewout); PySys_SetObject("stderr", pnewerr); } else poldout = polderr = pnewout = pnewerr = nullptr; std::wstring_convert<std::codecvt_utf8_utf16<wchar>> cvt; std::string str = cvt.to_bytes(err); std::size_t pos = str.find(text('.')); if (pos != std::string::npos) { std::string mod = str.substr(0, pos); PyObject* dest = PyImport_ImportModule(mod.c_str()); PyObject* main = PyImport_AddModule("__main__"); PyObject_SetAttrString(main, mod.c_str(), dest); } str.insert(0, "print "); int irslt = PyRun_SimpleString(str.c_str()); if (irslt != 0) err = text("Internal error that PyRun_SimpleString fail"); else err = text("Execute python function successfully .."); if (pnewout != nullptr) PySys_SetObject("stdout", poldout); if (pnewerr != nullptr) PySys_SetObject("stderr", polderr); if (pfile != nullptr) fclose(pfile); return irslt; }
int CPython::ExecEcho(const std::wstring &cmds, std::wstring &err, HANDLE hfile) { int id = 0; FILE *pfile = nullptr; DWORD count = 0; PyObject *poldout, *polderr, *pnewout, *pnewerr; if (cmds.length() <= 0) { err = text("No python command found"); return 1; } if (DuplicateHandle ( GetCurrentProcess(), hfile, GetCurrentProcess(), &hfile, 0, false, DUPLICATE_SAME_ACCESS )) { id = open_osfhandle((intptr_t)hfile, _O_WRONLY); pfile = fdopen(id,"w"); setvbuf(pfile,nullptr,_IONBF,1024); poldout = PySys_GetObject("stdout"); polderr = PySys_GetObject("stderr"); pnewout = PyFile_FromFile(pfile, "logger", "w", nullptr); pnewerr = PyFile_FromFile(pfile, "logger", "w", nullptr); PySys_SetObject("stdout", pnewout); PySys_SetObject("stderr", pnewerr); } else poldout = polderr = pnewout = pnewerr = nullptr; std::wstring_convert<std::codecvt_utf8_utf16<wchar>> cvt; std::string str = cvt.to_bytes(cmds); std::size_t pos = str.find(text('.')); if (pos != std::string::npos) { std::string mod = str.substr(0, pos); PyObject* dest = PyImport_ImportModule(mod.c_str()); PyObject* main = PyImport_AddModule("__main__"); PyObject_SetAttrString(main, mod.c_str(), dest); } str.insert(0, "print "); int irslt = PyRun_SimpleString(str.c_str()); if (irslt != 0) err = text("Internal error that PyRun_SimpleString fail"); else err = text("Execute python expression successfully .."); if (pnewout != nullptr) PySys_SetObject("stdout", poldout); if (pnewerr != nullptr) PySys_SetObject("stderr", polderr); if (pfile != nullptr) fclose(pfile); return irslt; }
USID event_stream_unixoid_create_stream_pair (void* inhandle, void* outhandle, Lisp_Object* instream, Lisp_Object* outstream, int flags) { int infd, outfd; /* Decode inhandle and outhandle. Their meaning depends on the process implementation being used. */ #if defined (HAVE_WIN32_PROCESSES) /* We're passed in Windows handles. Open new fds for them */ if ((HANDLE)inhandle != INVALID_HANDLE_VALUE) { infd = open_osfhandle ((HANDLE)inhandle, 0); if (infd < 0) return USID_ERROR; } else infd = -1; if ((HANDLE)outhandle != INVALID_HANDLE_VALUE) { outfd = open_osfhandle ((HANDLE)outhandle, 0); if (outfd < 0) { if (infd >= 0) close (infd); return USID_ERROR; } } else outfd = -1; flags = 0; #elif defined (HAVE_UNIX_PROCESSES) /* We are passed plain old file descs */ infd = (int)inhandle; outfd = (int)outhandle; #else # error Which processes do you have? #endif *instream = (infd >= 0 ? make_filedesc_input_stream (infd, 0, -1, 0) : Qnil); *outstream = (outfd >= 0 ? make_filedesc_output_stream (outfd, 0, -1, LSTR_BLOCKED_OK) : Qnil); #if defined(HAVE_UNIX_PROCESSES) && defined(HAVE_PTYS) /* FLAGS is process->pty_flag for UNIX_PROCESSES */ if ((flags & STREAM_PTY_FLUSHING) && outfd >= 0) { Bufbyte eof_char = get_eof_char (outfd); int pty_max_bytes = get_pty_max_bytes (outfd); filedesc_stream_set_pty_flushing (XLSTREAM(*outstream), pty_max_bytes, eof_char); } #endif return FD_TO_USID (infd); }