Недопустимое требование, ошибка синтаксического анализа в ''

Я пытаюсь подключиться к хосту с помощью разных потоков в python, но иногда получаю ошибку (1 раз в 25 раз выполнения). Я видел похожие потоки и надеялся, что обновление pip до 8.1.1 решит эту проблему, но не решил.

фрагмент кода:

def getkpis(self,cmd,host):
    ssh=paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        ssh.connect(host,username='root',look_for_keys=True)
        stdin, stdout, stderr = ssh.exec_command(cmd)
        paramiko.util.log_to_file("kpiparamiko.log")
        output=stdout.read()
        appendarray=output.split('\n')
        sys.stdin.flush()
        ssh.close()
    except paramiko.SSHException, e:
        print str(e)

Видна ошибка:

Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib64/python2.7/threading.py", line 811, in __bootstrap_inner
self.run()
File "/usr/lib64/python2.7/threading.py", line 764, in run
self.__target(*self.__args, **self.__kwargs)
File "/conf/home/smodugu/kpiparse.py", line 56, in getkpis
ssh.connect(host,username='root',look_for_keys=True)
File "/usr/lib/python2.7/site-packages/paramiko/client.py", line 338, in     connect
t.start_client()
File "/usr/lib/python2.7/site-packages/paramiko/transport.py", line 493, in       start_client
raise e
RequirementParseError: Invalid requirement, parse error at "''"

person saketh modugu    schedule 13.03.2017    source источник


Ответы (2)


Вчера я смог обойти это, используя более старую версию setuptools, pip install "setuptools<34", но сегодня проблема вернулась. Я смог обойти это, добавив 0,1-секундный сон в цикле, который ставил потоки в очередь. Почему многопоточные вызовы SSHClient paramiko вызывают эту ошибку с помощью pip/setuptools, я понятия не имею.

person Wyrmwood    schedule 12.04.2017

Похоже, что функция подключения не является потокобезопасной в версии paramiko для python2.7.

Решение состоит в том, чтобы использовать объект Lock из модуля потоков, from threading import Lock. Затем оберните вызов функции connect клиента paramiko с помощью объекта блокировки. Например: from threading import Lock lock = Lock() ... lock.acquire() client.connect(...) lock.release()

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

*** Я не уверен, существует ли проблема в более новых версиях paramiko, на которые стоит обратить внимание.

person Max    schedule 17.07.2018