Python:子进程“调用”函数找不到路径

时间:2016-07-06 18:26:20

标签: python bash shell ssh subprocess

我有一个需要在服务器上运行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”错过的东西的指针都会非常有帮助。

1 个答案:

答案 0 :(得分:2)

确保您的脚本已准备好执行

  1. 给你的剧本一个shebang线
  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 }})。

    1. 为您的脚本提供正确的文件权限
    2. 出于您的目的,可能只为当前用户授予读取和执行脚本的权限。在这种情况下,请使用Script_Test.bash。这里重要的是正确的用户(chmod u+x Script_Test.sh)/组(u+)有权执行脚本。

      1. 确保您的script's path is in the $PATH environment variable
      2. 在Python脚本中执行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

        快乐的编码!