首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

bcb6调用python的一种办法。解决方法

2012-02-25 
bcb6调用python的一种办法。本质上就是通过管道,调用绿色版的python。抛砖引玉,希望能看到更好的办法。嘿嘿嘿

bcb6调用python的一种办法。
本质上就是通过管道,调用绿色版的python。抛砖引玉,希望能看到更好的办法。嘿嘿嘿嘿。
下载portable   python1.1   2.61(此为绿色版,如果你真的这么用,需要精简一下,比如doc,txt以及没用的模块都删掉)   然运行得到一个PortablePython_1.1_py2.6.1文件夹。
太长了。改名为py261得了。放到你的程序目录下面,如下面代码
[code=C/C++]//---------------------------------------

#include   <vcl.h>
#pragma   hdrstop

#include   "Unit1.h "

//---------------------------------------
#pragma   package(smart_init)
#pragma   resource   "*.dfm "
TForm1   *Form1;
bool   __fastcall   RunCmd(AnsiString   cmd,   TStringList   *   stringlist);
//---------------------------------------
__fastcall   TForm1::TForm1(TComponent*   Owner)
                :   TForm(Owner)
{
}

bool   __fastcall   RunCmd(AnsiString   cmd,   TStringList   *   stringlist)
{
    TMemoryStream   *memstream   =   new   TMemoryStream();
    AnsiString   rn   =   "\\r\\n ";
    PROCESS_INFORMATION   proc;
    STARTUPINFO   start;
    SECURITY_ATTRIBUTES   sa;
    long   ret;
    unsigned   long   lngBytesread;
    HANDLE   hReadPipe,   hWritePipe;
    char   *strBuff   =   (char   *)malloc(256);
    if(strBuff   ==   NULL)
    {
        return   false;
    }
    sa.nLength   =   sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle   =   true;
    sa.lpSecurityDescriptor   =   NULL;
    ret   =   CreatePipe(&hReadPipe,   &hWritePipe,   &sa,   0);
    if(ret   ==   0)
    {
        //   创建管道失败  
        return   false;
    }
    memset(&start,   0x00,   sizeof(STARTUPINFO));
    start.cb   =   sizeof(STARTUPINFO);
    start.dwFlags   =   STARTF_USESTDHANDLES   |   STARTF_USESHOWWINDOW;
    start.hStdOutput   =   hWritePipe;
    start.hStdError   =   hWritePipe;
    bool   retc   =   CreateProcess(NULL,   cmd.c_str(),   NULL,   NULL,   true,   0,   0,   NULL,   &start,
                                                        &proc);
    if(!retc)
    {
        return   false;
    }
    CloseHandle(hWritePipe);
    unsigned   long   len;
    memstream-> Position   =   0;
    while(true)
    {
        memset(strBuff,   0x00,   256);
        GetFileSize(hReadPipe,   &len);
        ret   =   ReadFile(hReadPipe,   strBuff,   256,   &lngBytesread,   NULL);
        if(ret   ==   0)


        {
            break;
        }
        else
        {
            memstream-> Write(strBuff,   lngBytesread);
        }
    }
    CloseHandle(proc.hProcess);
    CloseHandle(proc.hThread);
    CloseHandle(hReadPipe);
    memstream-> Position   =   0;
    free(strBuff);
    stringlist-> LoadFromStream(memstream);
    memstream-> Clear();
    delete   memstream;
    return   true;
}


//---------------------------------------

void   __fastcall   TForm1::Button1Click(TObject   *Sender)
{
String   path   = "D:\\Program   Files\\Borland\\CBuilder6\\Projects\\python\\Py261\\App\\ ";
TStringList   *lst   =new   TStringList;
RunCmd   (path+ "python   c:\\1.py ",lst);
Memo1-> Lines-> Clear();
Memo1-> Lines-> AddStrings(lst);
delete   lst;
}[/code]
1.py我写句话print   88**88,按钮点击后得到结果显示到memo1里面。那是相当的快啊。以上代码为了简单,路径都写死了。
[code=SQL]1301592834942972055182648307417315364538725075960067
82791531148472245234096631721580510682095919083330970493434651
7741237438752456673499160125624414995891111204155079786496
[/code]

[解决办法]
谢谢,学习了。
[解决办法]
bcb 下使用 python 的好处是什么?是为了运行脚本吗?
[解决办法]
我还没有学会Python ...

热点排行