使用MicroPython加载和编译没有系统文件的python文件

时间:2017-09-14 18:53:45

标签: python c micropython

我正在使用的MicroPython Github

我想在MicroPython上运行一些非常简单的代码,并且我已经使用自己的代码成功地从Python调用了C函数,反之亦然。但是,它仅适用于Windows(Visual Studio IDE)。

现在,我想使用Crossworks IDE将此代码加载到Cortext M4芯片上。当我尝试将代码从Visual Studio复制并粘贴到crossworks时,花了一些工作来弄清楚依赖关系和生成的头文件。

它仅适用于printf等基本功能,但忽略了我的函数调用。原因是它试图查找我的Python文件但找不到它。

以下是我必须加载和编译Python代码的代码:

void compile_pyfile(const char* fileName) {
    //load and compile python src file
    mp_lexer_t *lex = mp_lexer_new_from_file(fileName);
    mp_parse_tree_t pt = mp_parse(lex, MP_PARSE_FILE_INPUT);
    mp_obj_t module_fun = mp_compile(&pt, lex->source_name, MP_EMIT_OPT_NONE, false);
    mp_call_function_0(module_fun);
}

这是调用Python编译输出的函数:

mp_obj_t call_py_func3(mp_obj_t* arr) {
    const char* fileName = "Hello.py";
    const char* funcName = "ret = test_array_C(*args)";
    nlr_buf_t nlr;
    if (nlr_push(&nlr) == 0) {
        qstr inArrName = qstr_from_str("args");
        mp_store_global(inArrName, *arr);
        compile_pyfile(fileName);
        exec_cmd(funcName);
        nlr_pop();
        return 0;
    } else {
        // uncaught exception
        return (mp_obj_t)nlr.ret_val;
    }
}

我不确定在这里需要做些什么才能让它在没有系统文件的情况下工作。以下是来自Github的micropython-master中提供的类似代码。这是一个字符串而不是文件。

void do_str(const char *src, mp_parse_input_kind_t input_kind) {
    nlr_buf_t nlr;
    if (nlr_push(&nlr) == 0) {
        mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, src, strlen(src), 0);
        qstr source_name = lex->source_name;
        mp_parse_tree_t parse_tree = mp_parse(lex, input_kind);
        mp_obj_t module_fun = mp_compile(&parse_tree, source_name, MP_EMIT_OPT_NONE, true);
        mp_call_function_0(module_fun);
        nlr_pop();
    } else {
        // uncaught exception
        mp_obj_print_exception(&mp_plat_print, (mp_obj_t)nlr.ret_val);
    }
}

1 个答案:

答案 0 :(得分:0)

为了让MicroPython调用C函数,需要在解释器中注册它们。我在这里有一个古老的例子:https://github.com/dhylands/micropython/commit/b801dbd39eb323494f946c13362f4957f5d7281b这会创建一个名为c_sample的模块。

如果查看对mpconfigport.h文件的更改,您可以将& mp_module_c_sample添加到MICROPY_PORT_BUILTIN_MODULES 这是允许导入c_sample工作的原因。

如果没有文件系统,您还可以将python源文件和预编译的字节码(.mpy)文件作为冻结文件包含在内,并且可以使用这些文件。 teensey端口没有文件系统并使用这种技术。