Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Если Вы хотите простой подход, это должно работать.
Вы захотите к ".close ()" файл сначала, таким образом, Вы будете знать, что он сбрасывается к диску из Python.
import os
os.system("scp FILE USER@SERVER:PATH")
#e.g. os.system("scp foo.bar joe@srvr.net:/path/to/foo.bar")
необходимо генерировать (на исходной машине) и установка (на целевой машине) ssh ключ заранее так, чтобы scp автоматически аутентифицировался с общественностью ssh ключ (другими словами, таким образом, сценарий не просит пароль).
Существует несколько различных способов приблизиться к проблеме:
, Каждый подход имеет свои собственные причуды. Необходимо будет установить ключи SSH для включения логинов пароля меньше при обертывании системных команд как "ssh", "scp" или "rsync". Можно встроить пароль в сценарий с помощью Paramiko или некоторой другой библиотеки, но Вы могли бы найти отсутствие срыва документации, особенно если Вы не знакомы с основами соединения SSH (например, - ключевые обмены, агенты, и т.д.). Вероятно, само собой разумеется, что ключи SSH являются почти всегда лучшей идеей, чем пароли для этого вида материала.
ПРИМЕЧАНИЕ: его твердое для избиения rsync, если Вы планируете передачу файлов через SSH, особенно если альтернатива является простым scp.
я использовал Paramiko глазом к замене системных вызовов, но нашел меня отодвинутым к обернутым командам из-за их простоты использования и непосредственного знакомства. Вы могли бы отличаться. Я дал Раковине поверхностный осмотр некоторое время назад, но это не обратилось ко мне.
При выборе путь системного вызова, Python предлагает массив опций, таких как os.system или модули команд/подпроцесса. Я пошел бы с модулем подпроцесса при использовании версии 2.4 +.
Вид hacky, но следующее должен работать:)
import os
filePath = "/foo/bar/baz.py"
serverPath = "/blah/boo/boom.py"
os.system("scp "+filePath+" user@myserver.com:"+serverPath)
Сделать это в Python (т.е. не переносящийся scp посредством подпроцесса. Popen или подобный) с библиотека Paramiko , Вы сделали бы что-то вроде этого:
import os
import paramiko
ssh = paramiko.SSHClient()
ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts")))
ssh.connect(server, username=username, password=password)
sftp = ssh.open_sftp()
sftp.put(localpath, remotepath)
sftp.close()
ssh.close()
(Вы, вероятно, хотели бы иметь дело с неизвестными хостами, ошибками, создавая любые необходимые каталоги, и так далее).
Вы, вероятно, использовали бы модуль подпроцесса . Что-то вроде этого:
import subprocess
p = subprocess.Popen(["scp", myfile, destination])
sts = os.waitpid(p.pid, 0)
, Где destination
, вероятно, имеет форму user@remotehost:remotepath
. Благодаря @Charles Duffy для указания на слабость в моем исходном ответе, который использовал единственный аргумент строки для определения scp операции shell=True
- который не обработает пробел в путях.
документация модуля имеет примеры проверки ошибок, которую можно хотеть выполнить в сочетании с этой операцией.
Гарантируют, что Вы настроили надлежащие учетные данные так, чтобы можно было выполнить необслуживаемый, passwordless scp между машинами . Уже существует stackoverflow вопрос для этого .