Снова проблемы с ошибками выполнения в Python

Обсуждение вопросов, связанных с системой проведения турниров ejudge.
Post Reply
apathism
Posts:64
Joined:09 January 2009, 22:54
Location:Мытищи, Россия
Снова проблемы с ошибками выполнения в Python

Post by apathism » 07 February 2013, 11:33

Доброго времени суток.

Использую ejudge 2.3.26 на ArchLinux. При обновлении python до версии 3.3 он начинает стабильно
выдавать ошибки выполнения на первом тесте со следующим stack trace:

Code: Select all

Fatal Python error: Py_Initialize: Unable to get the locale encoding
Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 1558, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1516, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1470, in _find_module
  File "<frozen importlib._bootstrap>", line 1305, in find_module
  File "<frozen importlib._bootstrap>", line 1284, in _get_loader
  File "<frozen importlib._bootstrap>", line 1356, in find_loader
  File "<frozen importlib._bootstrap>", line 1392, in _fill_cache
PermissionError: [Errno 1] Operation not permitted: '/usr/lib/python3.3/'
В репозиториях, судя по исходникам, непатченная версия python прямиком с python.org.
И при откате на python 3.2 все начинает работать нормально. Не попадается ли похожая
проблема в других дистрибутивах? У меня есть ощущение, что проблема уже решена в
downstream и во многих дистрибутивах наложен какой-то патч, который решает эту проблему.

apathism
Posts:64
Joined:09 January 2009, 22:54
Location:Мытищи, Россия

Re: Снова проблемы с ошибками выполнения в Python

Post by apathism » 04 March 2013, 01:38

К сожалению, я так и не понял, как решать данную проблему. Она и в ubuntu наблюдается. А именно, при попытке загрузить модули, python3 хочет получить содержимое директории /usr/lib/python3.3 и использует os.listdir, что приводит к ошибке доступа, т.к. ядро запрещает данный системный вызов. Вопрос: как это обойти и можно ли обойти безопасно?

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Снова проблемы с ошибками выполнения в Python

Post by cher » 04 March 2013, 21:31

Какая версия ядра Linux?

apathism
Posts:64
Joined:09 January 2009, 22:54
Location:Мытищи, Россия

Re: Снова проблемы с ошибками выполнения в Python

Post by apathism » 05 March 2013, 00:57

3.7.5 + патч с сайта.

apathism
Posts:64
Joined:09 January 2009, 22:54
Location:Мытищи, Россия

Re: Снова проблемы с ошибками выполнения в Python

Post by apathism » 08 March 2013, 16:43

Повникал в код, в общем в python os.listdir обращается к функции fdopendir из состава glibc (у меня он версии 2.17), который в свою очередь делает вызов fcntl(fd, F_GETFL), который нужен, чтобы проверить, что файловый дескриптор открыт на чтение, а не на запись. Судя по всему, именно из-за вызова fcntl происходит Runtime Error в python.
  • Верна ли моя догадка? Ни в исходники ядра, ни в исходники glibc до этого не лез, так что утверждать, что все именно так не берусь.
  • Безопасно ли в патче разрешить fcntl делать запросы с параметром F_GETFL? Если да, то почему бы это не сделать в следующей версии патча?

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Снова проблемы с ошибками выполнения в Python

Post by cher » 08 March 2013, 17:06

Как я понял, проблема возникает только в случае использования импортируемых модулей?

apathism
Posts:64
Joined:09 January 2009, 22:54
Location:Мытищи, Россия

Re: Снова проблемы с ошибками выполнения в Python

Post by apathism » 08 March 2013, 17:22

Даже без них. В python 3.3 появился новый importlib, и он при инициализации интерпретатора делает os.listdir в /usr/lib/python3.3 и смотрит, какие модули есть. Правда, на /usr/lib/python3.3 не все ограничивается, он ещё лезет в /usr/lib/python3.3/encodings и т.п.

apathism
Posts:64
Joined:09 January 2009, 22:54
Location:Мытищи, Россия

Re: Снова проблемы с ошибками выполнения в Python

Post by apathism » 19 March 2013, 00:02

Заставил python 3.3 работать очень костыльным способом, а именно в исходниках Python заменил вызов os.listdir на свою обертку, которая для /usr/lib/python3.3 и всех поддиректорий подсовывает предподсчитанные значения. :|

Post Reply