用python代码creatprocess函数_如何在Windows上用C语言从CreateProcess执行Python脚本?

我已经设法让C代码在Unix上使用C代码中的管道愉快地调用Python脚本。我现在需要在Windows上做同样的操作。在

实际上,我想在Windows上用不同的脚本语言编写脚本,比如Python/Lua等,并且能够使用STDIN/STDOUT等来执行它们

我一直在看“CreateProcess”电话:

尽管我可以让它与“用C编写的子脚本”一起工作,但我不能让它调用Python脚本。在

下面是“我的windows”框中的“父/发件人代码”:#include

#include

#include

#pragma comment(lib, "User32.lib")

void DisplayError(char *pszAPI);

void readFromPipe(HANDLE hPipeRead);

void createChildProcess(char *commandLine,

HANDLE hChildStdOut,

HANDLE hChildStdIn,

HANDLE hChildStdErr);

DWORD WINAPI writeToPipe(LPVOID lpvThreadParam);

HANDLE hChildProcess = NULL;

HANDLE hStdIn = NULL;

BOOL bRunThread = TRUE;

char *inputStream;

int main(int argc, char *argv[]){

HANDLE hOutputReadTmp,hOutputRead,hOutputWrite;

HANDLE hInputWriteTmp,hInputRead,hInputWrite;

HANDLE hErrorWrite;

HANDLE hThread;

DWORD ThreadId;

SECURITY_ATTRIBUTES sa;

int streamLen;

sa.nLength= sizeof(SECURITY_ATTRIBUTES);

sa.lpSecurityDescriptor = NULL;

sa.bInheritHandle = TRUE;

if (!CreatePipe(&hOutputReadTmp,&hOutputWrite,&sa,0))

return 1;

if (!DuplicateHandle(GetCurrentProcess(),hOutputWrite,

GetCurrentProcess(),&hErrorWrite,0,

TRUE,DUPLICATE_SAME_ACCESS))

return 1;

if (!CreatePipe(&hInputRead,&hInputWriteTmp,&sa,0))

return 1;

if (!DuplicateHandle(GetCurrentProcess(),hOutputReadTmp,

GetCurrentProcess(),

&hOutputRead,

0,FALSE,

DUPLICATE_SAME_ACCESS))

return 1;

if (!DuplicateHandle(GetCurrentProcess(),hInputWriteTmp,

GetCurrentProcess(),

&hInputWrite,

0,FALSE,

DUPLICATE_SAME_ACCESS))

return 1;

if (!CloseHandle(hOutputReadTmp)) return 1;;

if (!CloseHandle(hInputWriteTmp)) return 1;;

if ( (hStdIn = GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE )

return 1;

if (argc == 2){

createChildProcess(argv[1], hOutputWrite,hInputRead,hErrorWrite);

}else{

puts("No process name / input stream specified\n");

return 1;

}

if (!CloseHandle(hOutputWrite)) return 1;;

if (!CloseHandle(hInputRead )) return 1;;

if (!CloseHandle(hErrorWrite)) return 1;;

hThread = CreateThread(NULL,0,writeToPipe,

(LPVOID)hInputWrite,0,&ThreadId);

if (hThread == NULL)

return 1;;

readFromPipe(hOutputRead);

if (!CloseHandle(hStdIn))

return 1;

bRunThread = FALSE;

if (WaitForSingleObject(hThread,INFINITE) == WAIT_FAILED)

return 1;;

if (!CloseHandle(hOutputRead)) return 1;;

if (!CloseHandle(hInputWrite)) return 1;;

}

void createChildProcess(char *commandLine,

HANDLE hChildStdOut,

HANDLE hChildStdIn,

HANDLE hChildStdErr){

PROCESS_INFORMATION pi;

STARTUPINFO si;

ZeroMemory(&si,sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);

si.dwFlags = STARTF_USESTDHANDLES;

si.hStdOutput = hChildStdOut;

si.hStdInput = hChildStdIn;

si.hStdError = hChildStdErr;

if (!CreateProcess(NULL,commandLine,NULL,NULL,TRUE,

NULL,NULL,NULL,&si,&pi))

hChildProcess = pi.hProcess;

if (!CloseHandle(pi.hThread)) return 1;;

}

void readFromPipe(HANDLE hPipeRead)

{

CHAR lpBuffer[256];

DWORD nBytesRead;

DWORD nCharsWritten;

while(TRUE)

{

if (!ReadFile(hPipeRead,lpBuffer,sizeof(lpBuffer),

&nBytesRead,NULL) || !nBytesRead)

{

if (GetLastError() == ERROR_BROKEN_PIPE)

break; // pipe done - normal exit path.

else

return 1; // Something bad happened.

}

if (!WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),lpBuffer,

nBytesRead,&nCharsWritten,NULL))

return 1;;

}

}

DWORD WINAPI writeToPipe(LPVOID lpvThreadParam)

{

CHAR read_buff[256];

DWORD nBytesRead,nBytesWrote;

HANDLE hPipeWrite = (HANDLE)lpvThreadParam;

while (bRunThread){

nBytesRead = 21;

strncpy(read_buff, "hello from the paren\n",21);

read_buff[nBytesRead] = '\0';

if (!WriteFile(hPipeWrite,read_buff,nBytesRead,&nBytesWrote,NULL)){

if (GetLastError() == ERROR_NO_DATA)

break; //Pipe was closed (normal exit path).

else

return 1;;

}

}

return 1;

}

上面的代码中有相当一部分是“硬编码”的,只是为了测试目的……本质上我传递一些文本,比如“来自paren的hello”发送给子级.exe".... 在

这是孩子的代码。c…是发送给它的简单回音

^{pr2}$

运行我发送的应用程序“调用子进程.exe子级.exe“而且效果100%

接下来我想把“child.c”改成PYTHON脚本。。。在import sys

if __name__ == "__main__":

inStream = sys.stdin.read()

outStream = inStream

sys.stdout.write(outStream)

sys.stdout.flush()

那么如何更改CreateProcess调用来执行这个脚本呢?在if (!CreateProcess("C:\\Python26\\python.exe", "echo.py",NULL, NULL,FALSE, 0,NULL,NULL,&si,&pi)){

但它从来没有起作用。在

有什么办法让这个工作起来吗?任何帮助将不胜感激。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值