我有两个服务器 A 和 B。我想要从服务器 A 发送一个图片文件到另一个服务器 B,但在发送之前,我想要检查一下服务器 B 上是否已经有了一个类似的文件。我尝试使用 os.path.exists(),但并没有成功。
print os.path.exists('ubuntu@serverB.com:b.jpeg')
尽管我在服务器B上放了一个确切的文件,但结果返回了假。我不确定是我的语法错误还是有更好的解决方案来解决这个问题。谢谢。
我有两个服务器 A 和 B。我想要从服务器 A 发送一个图片文件到另一个服务器 B,但在发送之前,我想要检查一下服务器 B 上是否已经有了一个类似的文件。我尝试使用 os.path.exists(),但并没有成功。
print os.path.exists('ubuntu@serverB.com:b.jpeg')
尽管我在服务器B上放了一个确切的文件,但结果返回了假。我不确定是我的语法错误还是有更好的解决方案来解决这个问题。谢谢。
os.path
函数仅适用于同一台计算机上的文件。它们对路径进行操作,而ubuntu@serverB.com:b.jpeg
不是路径。
为了实现这一点,您需要远程执行脚本。通常可以使用以下代码:
def exists_remote(host, path):
"""Test if a file exists at path on a host accessible with SSH."""
status = subprocess.call(
['ssh', host, 'test -f {}'.format(pipes.quote(path))])
if status == 0:
return True
if status == 1:
return False
raise Exception('SSH failed')
您可以使用以下代码判断文件是否存在于另一台服务器上:
if exists_remote('ubuntu@serverB.com', 'b.jpeg'):
# it exists...
请注意,这可能会非常缓慢,甚至可能超过100毫秒。
return subprocess.call(['ssh', host, 'test -e ' + pipes.quote(path)]) == 0
- jfstest -e
用于查看是否存在任何文件(目录或常规文件),test -f
用于查看它是否存在并且是一个常规文件,或者 test -d
用于查看它是否存在并且是一个目录。 - jvriesem$HOME
的目录,也没有名为 ~
的目录。原来 $HOME/test
实际上不是文件路径。相反,你必须用 HOME
环境变量的值替换 $HOME
,一旦你这样做了,你就得到了一个文件路径。操作系统不会为你完成这个任务。 - Dietrich EppHOME
环境变量的值。您可以通过允许shell扩展来实现此操作,但是允许shell扩展存在潜在的重大安全风险。 - Dietrich Epptest -f '~/abc def'
改为 test -f ~/'abc def'
,或者只使用 test -f 'abc def'
。如果你希望以这种方式工作,你的 Python 代码必须正确解析路径并进行转换。如果 SSH 可用,则通常可以使用类似SFTP的协议。 - Dietrich Epp
os.path
模块不理解任何网络协议。当然,如果网络路径在文件系统中的某个位置被挂载,那么您可以通过其路径访问它。 - DaveP