происходит с кодом, подобным xyz->method()
, где xyz
не является объектом и, следовательно, method
не может
Это фатальная ошибка, которая остановит сценарий (уведомление о прямой совместимости: это станет захватывающей ошибкой, начиная с PHP 7).
Чаще всего это знак что в коде отсутствуют проверки условий ошибок. Убедитесь, что объект фактически является объектом перед вызовом его методов.
Пример типичного будет
// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
В приведенном выше примере запрос не может и prepare()
назначит false
на $statement
. Попытка вызвать метод execute()
приведет к Fatal Error, потому что false
является «не объектом», потому что значение является логическим.
Выясните , почему ваша функция вернула логическое значение вместо объекта. Например, проверьте объект $pdo
для последней произошедшей ошибки. Подробности о том, как отлаживать это, будут зависеть от того, как обрабатываются ошибки для конкретной рассматриваемой функции / объекта / класса.
Если даже сбой ->prepare
не выполняется, то ваш дескриптор
// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
базы данных
// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
не попал в текущий объем . Найдите, где он определился. Затем передайте его как параметр, сохраните его как свойство или поделите его через глобальную область.
Другой проблемой может быть условное создание объекта, а затем попытка вызова метода вне этого условного блока. Например,
if ($someCondition) {
$myObj = new MyObj();
}
// ...
$myObj->someMethod();
Пытаясь выполнить метод вне условного блока, ваш объект не может быть определен.
Вопросы, относящиеся:
Полное paramiko распределение поставлется с большим количеством хороших демонстрации .
В подкаталоге демонстраций, demo.py
и interactive.py
имеют полные интерактивные примеры TTY, которые, вероятно, были бы излишеством для Вашей ситуации.
В Вашем примере выше ssh_stdin
действия как стандартный объект файла Python, таким образом ssh_stdin.write
должен работать, пока канал все еще открыт.
я никогда не должен был писать в stdin, но документы предполагают, что канал закрывается, как только команда выходит, таким образом с помощью стандарта stdin.write
, метод для повышения пароля, вероятно, не будет работать. Там ниже находятся на одном уровне команды paramiko на самом канале, которые дают Вам, больше управления - видит, как SSHClient.exec_command
метод реализован для всех окровавленных деталей.
Я не знаком с paramiko, но это может работать:
ssh_stdin.write('input value')
ssh_stdin.flush()
Для получения информации о stdin:
http://docs.python.org/library/sys.html?highlight=stdin#sys.stdin
Вам нужен Pexpect, чтобы получить лучшее из обоих миров (expect и ssh-оболочки).