【问题标题】:Python ssh program not working due to different path separator on linux and windows由于 linux 和 windows 上的路径分隔符不同,Python ssh 程序无法运行
【发布时间】:2019-11-08 11:44:20
【问题描述】:

我正在使用 MacOS 开发 Python2.7 应用程序,该应用程序使用 paramiko 连接到远程 linux 机器。现在,我把我早期的代码给一个微软Windows用户测试,马上就遇到了os.path.join默认在路径中使用\作为分隔符的问题,当应用程序调用远程执行的命令时机器。所以,我必须确保在linux上进行操作时使用正确的分隔符,而在本地机器上使用默认的分隔符。

我认为这里最简单的解决方案是定义我自己的 joinpath 函数,该函数始终使用 / 作为分隔符,并在远程操作时调用此函数。

def joinpath(*args):
    return "/".join(args)

或者有没有更好更通用的方法来处理这种情况?

【问题讨论】:

  • 你加入什么路径?为什么不用 Python 的路径连接?
  • 使用os.path.join 会产生类似/home/user\software 的结果,当路径指向远程Linux 计算机上的某个东西时会出错。
  • 举一个导致这种情况的args 的例子。我认为在传递之前,您的字符串中有一些斜杠或反斜杠。 (例如,“/home/user”和“software”当然会以/home/user\software 的形式加入,但os.path.join 不是问题,而是你的论点!)
  • "os.path.join 默认使用 \ 作为路径中的分隔符,当应用程序在 linux 机器上运行时" - 不可能,因为代码在 Linux 上运行,Python 将使用 Linux然后分隔符。没关系,那是一台远程机器(我什至检查了它,因为我有一台带有 ssh 的 Windows 机器到一台目前打开 Python 解释器的 Linux 机器:P)。
  • 相信我,参数中没有反斜杠。使用paramiko 的示例:with self.sftp_client.open(os.path.join(workdir, jobname+ext)) as f:。这是从 Windows 计算机调用的,但 sftp 客户端会在远程 linux 计算机上打开一个文件。所以windows分隔符是用来加入为linux机器做路径的。

标签: python windows python-2.7 path cross-platform


【解决方案1】:

当应用在linux机器上运行时

这句话基本上意味着Python是在Linux上运行的。虽然这样:

这是从 Windows 计算机调用的,但是 sftp 客户端在远程 linux 机器上打开一个文件

实际上就是这一切。


所以:

os 模块在您的操作系统(运行 Python 的地方)上运行,为您提供特定于操作系统的正确结果

SSH(包括 SFTP)服务器不提供它们使用的 CLI,包括分隔符。他们只是给你一个通用的连接接口(如果是 SFTP,处理文件传输),但其余的基本上是你的问题。 - 我自己使用 Python 通过 ssh 处理网络设备,我不得不例如手动处理识别错误等,因为输出仅为文本。

这意味着,如果您知道您将仅连接到 Linux 机器,请使用您的连接(可能会添加更多,以防您的目录路径以“/”结尾 - 在您的情况下,这将导致路径中出现“//”)。

如果您将同时连接到 Windows 和 Linux,请执行回退 - 捕获错误(或在输出中手动找到它,我没有使用 paramiko,所以我不知道它是如何处理的),并且使用另一个分隔符作为后备并在该会话中记住它。

【讨论】:

    猜你喜欢
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多