Python 使用pysftp的sftp问题

Python 使用pysftp的sftp问题,python,sftp,Python,Sftp,我正在尝试使用pysftp通过sftp将文件从本地计算机发送到服务器 使用命令行作为登录服务器时: sftp -o port=111 user_name@host 然后执行pwd我得到/作为当前位置 因此,我想在pysftp中执行相同的操作,如下所示: import pysftp cnopts = pysftp.CnOpts() cnopts.hostkeys = None with pysftp.Connection("host", username="user_name", passwo

我正在尝试使用pysftp通过sftp将文件从本地计算机发送到服务器

使用命令行作为登录服务器时:

sftp -o port=111 user_name@host
然后执行
pwd
我得到
/
作为当前位置

因此,我想在
pysftp中执行相同的操作,如下所示:

import pysftp
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None

with pysftp.Connection("host", username="user_name", password="password", port=111, cnopts=cnopts) as sftp:
    print(sftp.pwd)
    sftp.put(local_file, sftp.pwd)
但是我得到了错误
IOError:[Errno 13]权限被拒绝

尽管如此,我还是能够在命令行中使用相同的凭据和像FileZilla这样的ftp客户端进行sftp

以下是完整的错误跟踪:

traceback (most recent call last):
  File "C:/workspace/segments-upload/media_math_segments_upload.py", line 232, in <module>
    sys.exit(0 if main() else 1)
  File "C:/workspace/segments-upload/media_math_segments_upload.py", line 226, in main
    process(s3_bucket, s3_dir, sftp_host, sftp_path, sftp_user_name, sftp_password, sftp_port)
  File "C:/workspace/segments-upload/media_math_segments_upload.py", line 182, in process
    sftp_file(local_file, sftp_host, sftp_path, sftp_user_name, sftp_password, sftp_port)
  File "C:/workspace/segments-upload/media_math_segments_upload.py", line 105, in sftp_file
    sftp.put(local_file, sftp.pwd)
  File "C:\Users\tkaghdo\AppData\Local\Continuum\Anaconda2\lib\site-packages\pysftp\__init__.py", line 364, in put
    confirm=confirm)
  File "C:\Users\tkaghdo\AppData\Local\Continuum\Anaconda2\lib\site-packages\paramiko\sftp_client.py", line 676, in put
    return self.putfo(fl, remotepath, file_size, callback, confirm)
  File "C:\Users\tkaghdo\AppData\Local\Continuum\Anaconda2\lib\site-packages\paramiko\sftp_client.py", line 634, in putfo
    with self.file(remotepath, 'wb') as fr:
  File "C:\Users\tkaghdo\AppData\Local\Continuum\Anaconda2\lib\site-packages\paramiko\sftp_client.py", line 327, in open
    t, msg = self._request(CMD_OPEN, filename, imode, attrblock)
  File "C:\Users\tkaghdo\AppData\Local\Continuum\Anaconda2\lib\site-packages\paramiko\sftp_client.py", line 730, in _request
    return self._read_response(num)
  File "C:\Users\tkaghdo\AppData\Local\Continuum\Anaconda2\lib\site-packages\paramiko\sftp_client.py", line 781, in _read_response
    self._convert_status(msg)
  File "C:\Users\tkaghdo\AppData\Local\Continuum\Anaconda2\lib\site-packages\paramiko\sftp_client.py", line 809, in _convert_status
    raise IOError(errno.EACCES, text)
IOError: [Errno 13] Permission denied
回溯(最近一次呼叫最后一次):
文件“C:/workspace/segments upload/media_math_segments_upload.py”,第232行,在
系统退出(如果main()则为0,否则为1)
文件“C:/workspace/segments upload/media_math_segments_upload.py”,第226行,主文件
进程(s3_bucket、s3_dir、sftp_主机、sftp_路径、sftp_用户名、sftp_密码、sftp_端口)
文件“C:/workspace/segments upload/media\u math\u segments\u upload.py”,第182行,正在处理中
sftp_文件(本地_文件、sftp_主机、sftp_路径、sftp_用户名、sftp_密码、sftp_端口)
文件“C:/workspace/segments upload/media_math_segments_upload.py”,第105行,在sftp_文件中
put(本地_文件,sftp.pwd)
文件“C:\Users\tkaghdo\AppData\Local\Continuum\Anaconda2\lib\site packages\pysftp\\uuuu init\uuuu.py”,第364行,输入
确认=确认)
文件“C:\Users\tkaghdo\AppData\Local\Continuum\Anaconda2\lib\site packages\paramiko\sftp\u client.py”,第676行,输入
返回self.putfo(fl、远程路径、文件大小、回调、确认)
文件“C:\Users\tkaghdo\AppData\Local\Continuum\Anaconda2\lib\site packages\paramiko\sftp\u client.py”,第634行,putfo格式
将self.file(remotepath,'wb')作为fr:
文件“C:\Users\tkaghdo\AppData\Local\Continuum\Anaconda2\lib\site packages\paramiko\sftp\u client.py”,第327行,打开
t、 msg=self.\u请求(CMD\u OPEN,filename,imode,attrblock)
文件“C:\Users\tkaghdo\AppData\Local\Continuum\Anaconda2\lib\site packages\paramiko\sftp\u client.py”,第730行,在请求中
返回self.\u读取\u响应(num)
文件“C:\Users\tkaghdo\AppData\Local\Continuum\Anaconda2\lib\site packages\paramiko\sftp\u client.py”,第781行,在“读取”响应中
自我转换状态(msg)
文件“C:\Users\tkaghdo\AppData\Local\Continuum\Anaconda2\lib\site packages\paramiko\sftp\u client.py”,第809行,处于转换状态
raise IOError(errno.EACCES,text)
IOError:[Errno 13]权限被拒绝

通过提供远程服务器上的文件名,问题得以解决。所以我就改变了

sftp.put(local_file, sftp.pwd)


完整的堆栈跟踪会很有帮助。知道这是一个IOError并不能真正帮助了解哪个操作失败,以及它是本地表示的远程异常还是本地系统调用失败。
sftp.put(local_file, "file_name.dat")