我有一个需要在服务器上运行bash命令的python程序。当我在我的本地目录中运行bash命令时,该程序可以正常工作:
import subprocess
from subprocess import call
call(['bash', 'Script_Test.sh'])
然而,在SSH到服务器并在服务器上运行类似的代码行并使用bash脚本的路径后,我收到错误“没有这样的文件或目录”
call['bash', path]
由于多种原因,这没有意义。我三重检查路径是否正确。我继续使用Putty,连接到那里的服务器,并使用相同的路径运行bash命令并且它有效,所以它不能是路径。我还运行了一些测试,以确保我已经SSH到正确的服务器,我是。我认为服务器上有一个安全问题,我运行bash,所以我尝试了猫。不,仍无法找到路径。
我对python子进程并不是很熟悉,所以任何指向我在这里用“call”错过的东西的指针都会非常有帮助。
答案 0 :(得分:2)
首先,在类Unix系统的脚本中是important that you include a shebang line。我建议for your script's portability使用#!/usr/bin/env bash
。
关于文件扩展名的说明:
我建议您remove the .sh
extension from your script。如果您使用Bourne Again Shell(bash
)来执行您的脚本,那么使用.sh
扩展名会产生误导。简单地说,Bourne Shell (sh
) is different than the Bourne Again Shell (bash
) - 所以不要使用文件扩展名,表明你使用的是与实际不同的shell!
It's not the end of the world if you don't do change your file extension - 如果您拥有正确的bash
shebang行,您的脚本仍将作为bash
脚本执行。不过,最好使用无文件扩展名(Script_Test
- 强烈偏好)或 .bash
文件扩展名({{1 }})。
出于您的目的,可能只为当前用户授予读取和执行脚本的权限。在这种情况下,请使用Script_Test.bash
。这里重要的是正确的用户(chmod u+x Script_Test.sh
)/组(u+
)有权执行脚本。
$PATH
environment variable g+
脚本一旦您按照这些步骤操作,您的Python脚本就应该像您在问题中所说的一样工作:
bash
如果您不想将脚本移动到import subprocess
from subprocess import call
your_call = call("Test_Script.sh")
环境变量中,请确保参考脚本的完整路径(当前目录$PATH
),你的情况):
./
最后,如果您的脚本没有shebang行,则需要在import subprocess
from subprocess import call
your_call = call("./Test_Script.sh")
函数中指定其他参数:
call
但是,我不建议采用最后一种方法。请参阅Python 2.7.12 documentation for the subprocess
package ...
警告:使用
import subprocess from subprocess import call your_call = call("./Test_Script.sh", shell=True)
可能存在安全隐患。有关详细信息,请参阅Frequently Used Arguments下的警告。
如果您仍有问题,请查看@zenpoy's explanation to a similar StackOverflow question。
快乐的编码!