Chinaunix首页 | 论坛 | 博客
  • 博客访问: 669153
  • 博文数量: 102
  • 博客积分: 2241
  • 博客等级: 大尉
  • 技术积分: 1670
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-08 10:08
文章分类

全部博文(102)

文章存档

2013年(6)

2012年(15)

2011年(81)

分类: Python/Ruby

2011-07-11 00:10:10


windows 下把python源程序当成一个程序,用于打开其它文件,在设置程序时不方便。
如果 python源程序用 py2exe 打包成 exe 不方便修改源代码。 以下使用 c 编译一个通用的 exe文件,用于加载运行 python 源程序

wrap.c
//   2011-07-09 windwiny
//   通用 python源程序 包装程序
// gcc wrap.c -o exewrapc.exe -I f:\ux\python26\include -L f:\ux\python26\libs -lpython26            // 程序运行时打开cmd窗口,调试用
// gcc wrap.c -o exewrapw.exe -I f:\ux\python26\include -L f:\ux\python26\libs -lpython26 -mwindows  // 程序运行时不打开cmd窗口
//

char * szName = "exewrap" ;

#include
#include
#include

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

// Py_OptimizeFlag = 2; // 优化级别
Py_VerboseFlag = 0; // 0, 1, 2 python load 模块详细信息
Py_NoSiteFlag = 1; // 取消 import site
Py_Initialize();

do {
PyObject *pymods, *pyfunc1, *pytmp1, *args;

int rc, i;

// import exewrap 模块
pytmp1 = PyString_FromString(szName);
pymods = PyImport_Import(pytmp1);
if (!pymods) {
printf(" * ERROR: import module %s\n", szName);
break;
}

// 查找模块中的函数 run
pyfunc1 = PyObject_GetAttrString(pymods, "run");
rc = PyCallable_Check(pyfunc1);
if (!rc) {
printf(" * ERROR: get function %s\n", "run");
break;
}

// 把 c 参数转换成 pyobject tuple
args = PyTuple_New(argc - 1);
for (i = 1; i < argc; i++) {
pytmp1 = PyString_FromString(argv[i]);
PyTuple_SetItem(args, i - 1, pytmp1);
}

// 调用 run 函数
PyObject_CallObject(pyfunc1, args);

} while (0);

Py_Finalize();
return 0;
}


exewrap.py
# coding: utf-8

# 2011-07-09 windwiny
# 通用 python源程序 包装程序。

#  自定义: 修改 python 安装路径、 __run_cmd 函数
#  注意:需要在 sys.path 中加入 python 安装路径后才能使用 import

def __run_cmd(*args):
    print ' ---> ---------------- run begin ----------------'
    import UliPad
    UliPad.App()
    print ' ---> ----------------  run end  ----------------'
    print


def run(*args):
    try:
        import sys
        print ' -> OLD sys.path:', sys.path
        sys.path += [
                'f:\\ux\\python26',
                'f:\\ux\\python26\\lib',
                'f:\\ux\\python26\\DLLs',
                'f:\\ux\\python26\\lib\\site-packages',
                'f:\\ux\\python26\\lib\\site-packages\\wx-2.8-msw-unicode'
            ]

        import traceback
        import os

        pgdir = os.path.dirname(os.path.abspath(__file__))
        sys.path.insert(0, pgdir)
        print ' -> NEW sys.path:', sys.path
        print
        print ' -> ORI __file__:', __file__
        print ' -> ABS __file__:', os.path.abspath(__file__)
        print

        print ' -> OLD os.getcwd:', os.getcwd()
        os.chdir(pgdir)
        print ' -> NEW os.getcwd:', os.getcwd()
        print

        if not hasattr(sys, 'argv'):
            sys.argv = []
        print ' -> OLD sys.argv:', sys.argv
        for i in args:
            sys.argv.append(i)
        sys.argv.insert(0, '.')
        print ' -> NEW sys.argv:', sys.argv
        print

        __run_cmd()

    except SystemExit:
        print ' -> SystemExit'
    except KeyboardInterrupt:
        print ' -> KeyboardInterrupt'
    except ImportError as ee:
        print ' -> ', ee
        print
        print '          sys.path not has python and wxpython path ?    '
        print
        print traceback.format_exc()
        print
    except Exception as ee:
        print ' ->>> -------- UliPad except --------'
        print ee
        print traceback.format_exc()
        print ' ->>> --------   except end  --------'


if __name__ == '__main__':
    print
    print '  This is a wrap file.  '
    print

阅读(2200) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~