【问题标题】:How to call a distant shell script from a python file? [duplicate]如何从 python 文件中调用远程 shell 脚本? [复制]
【发布时间】:2014-07-18 12:02:56
【问题描述】:

我想知道是否可以从 python 程序调用 shell 脚本,但 shell 脚本 与 python 文件不在同一目录中? 目前我只是成功调用了一个 shell 脚本,该脚本与调用它的 python 文件位于同一目录中,这要归功于这个命令:

所以基本上,在我必须做的程序中,我无法更改我的 bash 脚本的位置,所以我必须找到一种方法从我的 python 文件中调用这个 bash 脚本(qnd 不一样路径)>

subprocess.call(["./my_shell_script.sh",my_argument])                                                                             

谢谢,

解决方案:

subprocess.call(["the/path/to/the/script/script.sh"])

乔丹

【问题讨论】:

  • 我怀疑这不是真正的重复。但是,我必须承认这一点对我来说不是很清楚。您知道如何在当前工作目录中调用 shell 脚本。鉴于其完整路径,您知道如何称呼它。从您的 cmets 看来,您似乎知道如何更改 PATH。您是否正在寻找“搜索可执行路径”之类的内容?您可能需要编辑您的问题以更广泛地了解您的问题。
  • 我按照您的建议进行了修改。正如你所说,如果 shell 脚本与我的 python 文件位于同一工作目录中,我知道如何调用它。但是问题是如果不在同一个目录下怎么调用呢
  • 感谢您花时间编辑您的问题。我的 猜测 是您真的希望将脚本 relative 启动到当前工作目录。您能给我们您的 Python 脚本路径您尝试启动的 Shell 脚本吗?
  • 解决方案是“显而易见的”,我编辑了我的帖子!非常感谢您的帮助!

标签: python bash


【解决方案1】:

./my_shell_script.sh 表示“当前工作目录中的my_shell_script

您是否尝试将 absolute path 替换为您的脚本?

subprocess.call(["/full/path/to/my_shell_script.sh",my_argument])

或者,如果您的脚本路径在您当前的PATH environment variable

subprocess.call(["my_shell_script.sh",my_argument])

或者再次(如果您的脚本路径在当前 PATH 中):

subprocess.call(["bash", "-c", " ".join("my_shell_script.sh",my_argument)])

从上面看,第一个和第二个解决方案需要一个适当的 shebang (#!/bin/bash) 作为脚本的第一行。第三种解决方案没有这个“限制”。


编辑:

如果您要启动其路径相对于当前工作目录的脚本,您必须提供relative path。这允许您的 Python 脚本和 Shell 脚本移动,只要它们的相对位置没有改变

例如,如果您的脚本位于当前工作目录的子目录my_subdir 中,您可能会这样写:

subprocess.call(["my_subdir/my_shell_script.sh",my_argument])

您还必须有机会使用.. 导航一级。你可以多次使用它来提升几个级别。例如:

subprocess.call(["../../a/b/c/my_shell_script.sh",my_argument])

上面的示例将在a/b/c 子目录中启动my_shell_script,从当前工作目录上方两层开始。

【讨论】:

  • 第一个解决方案:如果脚本在另一个路径中,它不起作用第二个解决方案:如果它与我的 python 文件位于同一目录中,这就是我用来启动脚本的方法。第三种解决方案:我没有尝试,因为我在哪里可以写启动脚本的路径?无论如何,谢谢,但我仍然被阻止:)
  • @Jordane 请花点时间查看我的回答。尤其是关于相对路径的edit。我想这就是你要找的东西!
  • @Sylvain Leroux 是的,Sylvain,这就是我要找的东西;)这是你的答案 subprocess.call(["my_subdir/my_shell_script.sh",my_argument]) 给了我解决方案!谢谢!但是,当我尝试提出一些论点时,它似乎不起作用..
【解决方案2】:

您应该始终将完整路径传递给脚本:

import shlex
import subprocess

cmd = '/bin/bash /home/jordane/scripts/script.sh -opt 1 arg1 arg2'
subprocess.call(shlex.split(cmd))

【讨论】:

  • 我试过了,但没用:我写了: cmd = '/bin/bash /home/path/to/my/file/script.sh' subprocess.call(shlex.split( cmd)) 但我有错误:/bin/bash: /home/path/to/my/file/script.sh: No such file or directory
  • 但如果我的 bash 脚本 '/bin/bash /home/path/to/my/file/script.sh' 的路径与我的 python 程序的路径相同,则它可以工作,否则,它不起作用。
【解决方案3】:

如果卡住了,可以打开一个全进程:

p = subprocess.Popen(['/path/to/script','arg1','arg2'], stdout=subprocess.PIPE)
stdout,stderr = p.communicate()

您也可以将其设置为 shell 模式。 这样您就可以让操作系统以您可能更熟悉的方式处理事情。

我假设你的路径中没有任何奇怪的字符?

【讨论】:

  • 有了这个解决方案,我的脚本就不再被阅读了......是的,路径没有奇怪的字符;)
  • 只是关于你对 Sylvain 的 cmets,确保参数是否需要包含“-”的参数。例如["/path/to/script","-u","用户名","-p","密码"]。还要确保将他的答案标记为答案。这有助于未来的用户,但考虑到他花时间回答你,这也是最礼貌的做法。你也许可以同时给他投票。
猜你喜欢
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2011-05-28
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多