Порядок выполнения Python с использованием модуля C - PullRequest
0 голосов
/ 16 июня 2010

Я пытаюсь выучить Python и столкнулся со странным поведением.Я экспериментирую с ctypes и самодельной (очень простой) DLL.

Это скрипт Python, который я пытаюсь запустить:

from ctypes import *
myLib = CDLL("libDlltest")
myLib.hello()
myLib.goodbye()

print 'I am a line'

myLib.goodbye()

Я настроил затмение в соответствии со сборкойбиблиотека в соответствии с этим руководством, и когда она не работала, я собрал ее в cygwin с помощью gcc.

hello () и goodbye () реализованы как

EXPORT void hello(void) {
    printf ("Hello\n");
}

EXPORT void goodbye(void) {
    puts ("Goodbye");
}

(где EXPORT - макрос, о котором вы можете прочитать подробнее в руководстве выше)

Тем не менее,это начинает становиться странным, когда вывод, который я получаю из программы:

I am a line
Hello
Goodbye
Goodbye

Если вы не заметили, распечатки не в правильном порядке.Текст, напечатанный из библиотечных функций, появляется после или непосредственно перед завершением выполнения программы, а текст, напечатанный с помощью python 'print', появляется первым, несмотря на то, что его называют вторым.

Я не могу представить, что это было предназначеноповедение.Я, наверное, в любом случае здесь делаю что-то не так, поэтому:

  • Что я могу сделать не так?
  • Есть ли способ объяснить это поведение?

1 Ответ

2 голосов
/ 16 июня 2010

Похоже, что стандартный вывод Python буферизован независимо от стандартного вывода Си. Вы должны попытаться вызвать flush () для них, чтобы заставить их записать свои данные.

...