Python IOError:[Errno 2]没有这样的文件-Paramiko put()

Python IOError:[Errno 2]没有这样的文件-Paramiko put(),python,python-2.7,sftp,paramiko,Python,Python 2.7,Sftp,Paramiko,我正在使用withSFTP.put(localFile,remoteFile)通过SFTP上传一个文件。如果需要,我会先用 makeCommand = 'mkdir -p "' + remotePath + '"' ssh.exec_command(makeCommand) 这有时是可行的,但我偶尔会遇到以下错误: sftp.put(localFile, remoteFile) File "build/bdist.macosx-10.8-intel/egg/pa

我正在使用with
SFTP.put(localFile,remoteFile)
通过SFTP上传一个文件。如果需要,我会先用

    makeCommand = 'mkdir -p "' + remotePath + '"'
    ssh.exec_command(makeCommand)
这有时是可行的,但我偶尔会遇到以下错误:

    sftp.put(localFile, remoteFile)
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 565, in put
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 245, in open
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 635, in _request
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 682, in _read_response
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 708, in _convert_status
    IOError: [Errno 2] No such file 
尽管本地文件确实存在(并且
localFile
是指向它的正确路径),但远程路径仍然存在。 关于一个类似的问题,我们进行了讨论和讨论,但提出的观点对我都没有帮助。我的服务器支持
df-hi
命令。 有人对此有什么建议或可能的解决方案吗

编辑


根据下面的建议,我尝试使用
sftp.chdir(remoteDirectory)
更改工作目录,但是这个调用产生了与上面完全相同的错误。看来这不仅仅是一个上传问题。有什么想法吗?

这个
IOError
是本地的,所以(无论出于什么原因)本地python似乎找不到
localFile
。在通话前进行安全检查可能有助于追踪问题:

if os.path.isfile(localFile):
    sftp.put(localFile, remoteFile)
else:
    raise IOError('Could not find localFile %s !!' % localFile)
如果您肯定
localFile
确实存在,那么这可能只是一个路径问题-
localFile
在绝对路径还是相对路径上?无论哪种方式,上面的
if
语句都将捕获它

编辑

通过对paramiko文件的跟踪显示,
sftp_client.py
(引发异常的那一行)的第245行实际上是

fr = self.file(remotepath, 'wb')
这是相当误导的,因为paramiko为远程文件抛出了一个
IOError
!我现在最好的猜测是
remoteFile
是一个丢失的目录,或者是一个您无权访问的目录

出于兴趣,你能列出远程目录吗

sftp.listdir(path=os.path.dirname(remoteFile))

要检查它是否在那里(或者它可能在那里,您可以对它进行写入)?

您确定该目录已创建并且是您的远程工作目录吗? Paramiko有自己的方法来创建新目录和导航远程文件系统。考虑使用类似的:

sftp.mkdir(remotedirectory)
sftp.chdir(remotedirectory)
sftp.put(localfile, remotefile)

这似乎是一个远程文件夹权限问题。尽管远程文件夹是在上载文件之前创建的,但文件夹上的权限似乎阻止了上载

问题与问题有关-如果我在上传之前设置了要上传到的文件夹的打开权限,程序可以正常上传。虽然对于权限问题,我应该获得
IOError:[Errno 13]权限被拒绝
,但由于我进行了更改,我没有遇到任何错误


我不确定是服务器给Paramiko的响应造成了问题,还是Paramiko本身的一个bug导致了
IOError:[Errno 2]没有这样的文件,而不是
Errno 13
,但这似乎解决了问题。

put方法有一个默认启用的确认参数,它将在传输后对文件进行统计

在我的例子中,我将文件传输到的远程服务器立即将任何传输的文件移动到另一个位置进行处理,这导致stat失败。将confirm参数设置为False可解决此问题

def put(self, localpath, remotepath, callback=None, confirm=True):
从paramiko来源sftp_client.py:

:参数布尔确认: 之后是否对文件执行stat()以确认文件 尺寸(自1.7.7起)


谢谢,去知道这是本地的。奇怪的是,我试着在上传之前打开文件,只是检查它是否可以打开,现在它可以上传了。所以,如果你基本上只是先打开它看看,然后关闭它,然后上传,出于某种原因,这是可行的。不知道为什么。在我找出原因之前,我会按照你建议的安全检查!不管怎么说,这都是巧合。上传工作了大约一个小时,现在我得到了同样的错误。即使我检查该文件是否存在并可以打开该文件,在尝试上载时也会出现上述错误?您好,谢谢您的编辑。是的,我可以列出远程目录,我可以访问它。我猜帕拉米科可能希望远程位置有一个文件?因此,我尝试使用
ssh.exec_command()
进行“触摸”,首先生成一个空白文件。奇怪的是,我的应用程序将正常上传一段时间,然后再次随机停止处理该错误。奇怪的是,即使是
sftp.listdir()
现在也会抛出相同的错误,即使我先确定该目录是否存在?我敢肯定,远程文件肯定是创建的。对于文件put/get,如果传递到文件的整个路径,则无需
chdir
。目前正在进行上传,因为我引入了重试和
触摸
,但作为备份,可以将文件放到
chdir
,然后将其放入。如果第一次尝试时出现错误,则可以将此作为回退实现。我按照您的建议尝试了此操作,奇怪的是
sftp.chdir()
会产生相同的错误。请参阅上面的“我的编辑”。您能否确认您试图写入或chdir的目录已存在。另外,检查syslog中是否有有用的东西。是的,确实有用。正如我上面提到的,我甚至可以使用
touch
在那个位置创建一个文件。这绝对是我要找的!我的远程服务器立即将任何传输的文件移动到另一个位置,我也面临着同样的问题。非常感谢你!