Как запустить IronPython в Linux

Я пытаюсь вызвать функцию C из IronPython 2.6 в Ubuntu 10.10. В качестве модели я использовал пример из распределения IP. Однако код C выдает «StandardError: Исключение было выдано целью вызова».

Я пробовал несколько подходов, но ни один из них не работает. Вот мой код:

pinvoke_test.h

extern void pinvoke_this(const char*);

pinvoke_test.c

#include <stdio.h>
#include "pinvoke_test.h"

void pinvoke_this(const char *b)
{
    FILE *file;
    file = fopen("file.txt","w+");
    fprintf(file,"%s", b);
    fclose(file);
}

pinvoke_test.py

import clr
import clrtype
import System

class NativeMethods(object):

    __metaclass__ = clrtype.ClrClass

    from System.Runtime.InteropServices import DllImportAttribute, PreserveSigAttribute
    DllImport = clrtype.attribute(DllImportAttribute)
    PreserveSig = clrtype.attribute(PreserveSigAttribute)

    @staticmethod
    @DllImport("pinvoke_test.o")
    @PreserveSig()
    @clrtype.accepts(System.Char)
    @clrtype.returns(System.Void)
    def pinvoke_this(c): raise RuntimeError("this should not get called")


def call_pinvoke_method():
    args = System.Array[object](("sample".Chars[0],))
    pinvoke_this = clr.GetClrType(NativeMethods).GetMethod('pinvoke_this')
    pinvoke_this.Invoke(None, args)

call_pinvoke_method()

Объектный файл компилируется командой "gcc -c pinvoke_test.c -o pinvoke_test.o". Я надеюсь, что кто-то может указать мне в правильном направлении.


person 0x1mason    schedule 17.03.2011    source источник
comment
Я бы предложил получить полную трассировку стека, используя -X:ExceptionDetail при запуске из ipy.exe. Просто знать текст исключения не так уж и полезно. Возможно, вам также повезет больше, если вы воспользуетесь библиотекой ctypes, так как это более Pythonic-способ общения с библиотеками C.   -  person Dino Viehland    schedule 18.03.2011


Ответы (1)


Возможно, это не является причиной вашей проблемы, но подпись pinvoke выглядит неправильно. Ваша функция C принимает char*, а не char.

  1. Это сопоставляется со строкой в ​​подписи pinvoke. Вам может потребоваться указать CharSet, чтобы обеспечить правильную сортировку, в зависимости от целевых платформ. См. http://www.mono-project.com/Interop_with_Native_Libraries#Strings.
  2. Это изменение будет означать, что ваша переменная 'args' также нуждается в настройке. Вам нужна строка «образец», а не первый символ.
  3. Примечание: тип char в C# соответствует 2-байтовому символу, а не байту.
person joncham    schedule 31.03.2011