繁体   English   中英

Python:子进程“调用”功能找不到路径

[英]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”的内容的指针都将非常有帮助。

确保脚本已准备好执行

  1. 给你的剧本一个排行

首先,在类似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

  1. 给您的脚本适当的文件权限

出于您的目的,也许仅授予当前用户读取和执行脚本的权限很重要。 在这种情况下,请使用chmod u+x Script_Test.sh 这里重要的是正确的用户( u+ )/组( g+ )具有执行脚本的权限。

  1. 确保脚本的路径在$PATH环境变量中

在Python脚本中执行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM