2013-03-13 4 views
4

У меня возникла проблема с внедрением python 3 для приложения, которое должно запускать собственные скрипты в python. Поскольку сценарии могут быть совершенно разными, а иногда и предоставляемыми пользователями, я пытаюсь изолировать каждое исполнение, и нет необходимости сохранять какие-либо данные между выполнением разных сценариев.Выполнение второго выполнения python завершено

Итак, мое решение состоит в том, чтобы обернуть каждое исполнение между Py_Initialize и Py_Finalize. Это выглядит примерно так:

void ExecuteScript(const char* script) 
{ 
Py_Initialize(); 

PyRun_SimpleString(script); 

Py_Finalize(); 
} 

Однако это не выполняется для конкретного питона сценария второй раз скрипт выполняется с:

done! 
Traceback (most recent call last): 
    File "<string>", line 8, in <module> 
    File "\Python33Test\Output\Debug\Python33\Lib\copy.py", line 89, in copy 
    rv = reductor(2) 
TypeError: attribute of type 'NoneType' is not callable 

Сценарий питон выглядит следующим образом:

class Data: 
    value1 = 'hello' 
    value2 = 0 

import copy 

d = Data() 
dd = copy.copy(d) 
print ('done!') 

Как вы можете видеть, в первый раз вокруг скрипта было выполнено «сделано!» был распечатан. Но во второй раз он вызывает исключение внутри функции копирования.

Похоже, что двигатель python остался в каком-то странном состоянии после первого завершения инициализации. Обратите внимание, что это python 3.

Также очень интересно отметить, что у Python 2.7 не было этой проблемы.

Я думаю, что могут быть другие примеры, которые могли бы лучше показать, что происходит, но у меня еще не было времени, чтобы найти.

Полные источники тестового проекта можно найти здесь: https://docs.google.com/file/d/0B86-G0mwwxZvNGpoM1Jia3E2Wmc/edit?usp=sharing

Примечание, файл 8MB, поскольку он включает в себя распределение питона.

Любые идеи о том, как решить это, оцениваются.

EDIT: Я также поместить копию проекта, содержащего флаг для переключения между Python 3 и Python 2.7 (файл 31 MB): https://docs.google.com/file/d/0B86-G0mwwxZvbWRldTd5b2NNMWM/edit?usp=sharing

EDIT: Ну, я тестировал с Python3.2, и она работала хорошо. Это похоже на ошибку только в Python3.3. Добавление в качестве проблемы: http://bugs.python.org/issue17408#

ответ

Смежные вопросы