Ошибка Python, getpwuid() не может найти пользователя root (uid=0)
Я встраиваю python в мою C++ симуляцию, чтобы я мог использовать boto для подключения к AWS simpleDB. Потокобезопасность реализована с использованием C++ std::mutex и std::lock_guard btw.
код для подключения к базе данных:
/* Decelarations and module imports */
sdb = PyObject_CallMethodObjArgs(boto, connect_sdb, access_key, secret_key, NULL);
if(sdb == nullptr){
std::cout << "Connecting to sdb failed.\nPython message: ";
PyErr_Print();
return 1;
}
Всякий раз, когда я работаю в течение определенного времени (~3e10 бит, всегда), я получаю KeyError во всех потоках при вызове getpwuid():
Сообщение об ошибке:
Connecting to sdb failed.
Python message: Traceback (most recent call last):
File "/usr/lib/python2.6/dist-packages/boto/__init__.py", line 240, in connect_sdb
File "/usr/lib/python2.6/dist-packages/boto/sdb/connection.py", line 122, in __init__
File "/usr/lib/python2.6/dist-packages/boto/connection.py", line 1100, in __init__
File "/usr/lib/python2.6/dist-packages/boto/connection.py", line 555, in __init__
File "/usr/lib/python2.6/dist-packages/boto/provider.py", line 196, in __init__
File "/usr/lib64/python2.6/posixpath.py", line 259, in expanduser
KeyError: 'getpwuid(): uid not found: 0'
Я посмотрел на трассировку и увидел, что это серия инициализации соединений, которая привела к запросу файлов домашнего каталога. Но затем он обнаружил, что $HOME не установлен, и начал запрашивать базу данных Unix passwd, и не смог найти пользователя с uid 0 (root?, Поскольку эта программа моделирования принадлежит пользователю root при установке)
def expanduser(path):
"""Expand ~ and ~user constructions. If user or $HOME is unknown,
do nothing."""
if not path.startswith('~'):
return path
i = path.find('/', 1)
if i < 0:
i = len(path)
if i == 1:
if 'HOME' not in os.environ:
import pwd
userhome = pwd.getpwuid(os.getuid()).pw_dir //where it raises KeyErrors
Теперь я ценю всех, кто так долго читал, я хочу спросить, при каких обстоятельствах $HOME не будет установлен и как getpwuid () не сможет найти root (когда uid=0?)
Отказ от ответственности: Если это кажется глупым способом сделать что-то, вы более чем можете указать на это и объяснить, но это очень много значит для меня, если вы можете помочь мне найти причину этой странной ошибки.
Несколько фактов, которые, я думаю, помогут:
- Блок кода, который подключается к sdb путем вызова PyObject_CallMethodObjArgs(), вызывается примерно 71 раз в каждом из 4 потоков.
- Не стесняйтесь спрашивать больше информации об ошибке...