У меня возникла проблема с внедрением 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#