Python 为什么pysftp库中的chdir不';t对pysftp库中执行的影响?

Python 为什么pysftp库中的chdir不';t对pysftp库中执行的影响?,python,ssh,sftp,paramiko,pysftp,Python,Ssh,Sftp,Paramiko,Pysftp,我使用pysftp(它是paramiko的包装器) /home/alex_测试中的脚本,我想执行该脚本 sftp.chdir("/home/alex_test") sftp.execute("source myscript.tcsh") 但它不起作用,因为找不到脚本 另一方面,它确实有效 sftp.execute("cd /home/alex_test;cat myscript.tcsh") 为什么?? 我的目标是为unix和Windows创建通用代码。执行方法实际上与SFTP无关。它在内部

我使用pysftp(它是paramiko的包装器)

/home/alex_测试中的脚本,我想执行该脚本

sftp.chdir("/home/alex_test")
sftp.execute("source myscript.tcsh")
但它不起作用,因为找不到脚本

另一方面,它确实有效

sftp.execute("cd /home/alex_test;cat myscript.tcsh")
为什么??
我的目标是为unix和Windows创建通用代码。

执行方法实际上与SFTP无关。它在内部打开一个单独的“exec”SSH通道。该通道与“SFTP”子系统通道完全隔离

如果您直接使用Paramiko库,您会更清楚,因为在那里您会清楚地看到Paramiko(由pysftp
内部使用。execute
)根本不使用Paramiko

实际上,即使是的文档也表明:

在远程机器上执行给定的命令执行该命令时不考虑远程
pwd


此外,SFTP协议本身没有工作目录的概念

pysftp(或者实际上是底层的Paramiko库)只在本地模拟这个过程。传递给PySTFP/Paramiko库SFTP方法的所有相对路径在发送到SFTP服务器之前都会转换为绝对路径。对于pysftp,这意味着几乎所有的方法(与远程路径一起工作),除了
.execute
。只有SFTP协议要求使用*nix样式的路径(即使实际的远程服务器系统使用不同的语法),这种转换才可能实现。因此PySTFP/Paramiko知道如何将相对路径转换为绝对路径


相反,传递给
.execute
方法的命令使用服务器的专有语法在服务器上完全执行。本地库无法理解并以某种方式神奇地转换它。

如果您键入sftp.execute('ls'),您将获得用户名目录的内容

在该目录中创建一个名为example.py的文件,并编写以下内容:

导入操作系统 os.chdir('/home/alex_test')
os.system('source myscript.tcsh')

现在运行:

execute('python example.py')


虽然不是最好的解决方案,但很有效。

请在每篇文章中只提出一个问题。我不理解你的解决方案@Martin Prikryl没有解决方案。你问过为什么它不起作用。我已经解释过了。那么,chdir的目标是什么@Martin PrikrylIt仅供SFTP使用。我相信我的回答很清楚。@LegitStack我相信我的回答暗示了这个问题的答案。只有SFTP方法受
chdir
-基本上所有PySTFP方法,除了
执行
-我编辑了我的答案,让它更清楚一点。你为什么要这么做?为什么不执行
sftp.execute('cd/home/alex_test;/myscript.tcsh')
?-更不用说这并没有回答这个问题。
sftp.execute("cd /home/alex_test;cat myscript.tcsh")