[英]Python: Subprocess “call” function can't find path
我有一个python程序,需要在服务器上运行bash命令。 当我在本地目录中运行bash命令时,该程序将运行:
import subprocess from subprocess import call call(['bash', 'Script_Test.sh'])
但是,在SSH连接到服务器并运行下面类似的代码行(其中服务器上有bash脚本的路径)后,出现错误“无此文件或目录”
call['bash', path]
出于多种原因,这没有任何意义。 我三重检查了路径是否正确。 我继续使用Putty,连接到那里的服务器,并使用相同的路径运行了一个bash命令,该命令可以正常工作,因此它不能成为路径。 我还进行了许多测试,以确保将SSH连接到正确的服务器,并且确实如此。 我以为我运行bash时服务器上存在安全问题,所以我改用cat。 否,仍然无法找到路径。
我对python子进程不是很熟悉,因此任何指向“ call”的内容的指针都将非常有帮助。
首先,在类似Unix的系统上的脚本中添加shebang行很重要 。 对于脚本的可移植性 ,我建议您使用#!/usr/bin/env bash
。
关于文件扩展名的注意事项:
我建议您从脚本中删除.sh
扩展名 。 如果使用Bourne Again Shell( bash
)执行脚本,则使用.sh
扩展名会产生误导。 简而言之, Bourne Shell( sh
)与Bourne Again Shell( bash
)不同 -因此,请勿使用文件扩展名来暗示您使用的外壳与实际的外壳不同!
如果您不更改文件扩展名,这不是世界末日 -如果您拥有正确的bash
shebang行,您的脚本仍将作为bash
脚本执行。 仍然是不使用文件扩展名 (强烈推荐使用Script_Test
)或.bash
文件扩展名 ( Script_Test.bash
)的好Script_Test.bash
。
出于您的目的,也许仅授予当前用户读取和执行脚本的权限很重要。 在这种情况下,请使用chmod u+x Script_Test.sh
。 这里重要的是正确的用户( u+
)/组( g+
)具有执行脚本的权限。
bash
脚本 完成这些步骤后,您的Python脚本应该可以按照您在问题中的调用方式运行:
import subprocess
from subprocess import call
your_call = call("Test_Script.sh")
如果您不想将脚本移到$PATH
环境变量中,只需确保引用了脚本的完整路径(在您的情况下为当前目录./
):
import subprocess
from subprocess import call
your_call = call("./Test_Script.sh")
最后,如果您的脚本没有shebang行,则需要在call
函数中指定一个附加参数:
import subprocess
from subprocess import call
your_call = call("./Test_Script.sh", shell=True)
但是,我不建议使用最后一种方法。 有关subprocess
包的信息,请参见Python 2.7.12文档 。
警告:使用
shell=True
可能会带来安全隐患。 有关详细信息,请参见“ 常用参数”下的警告。
如果您仍然遇到问题,请查看@zenpoy对类似StackOverflow问题的解释 。
编码愉快!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.