【问题标题】:Executing a python script in Ubuntu defaults to shell and not bash在 Ubuntu 中执行 python 脚本默认为 shell 而不是 bash
【发布时间】:2016-11-07 15:11:58
【问题描述】:

我在 Ubuntu 中运行依赖于正在安装的软件包的 python 脚本。这些都已安装,因为我可以调用它们,但脚本不能。

我认为这是因为脚本使用的是 shell(sh) 而不是 bash 版本。我收到此错误消息:

sh: genomeCoverageBed: command not found

但可以在 Bash 中手动调用基因组覆盖床:

ubuntu@fat:~/jonathan/scripty$ genomeCoverageBed 


Tool:    bedtools genomecov (aka genomeCoverageBed)
Version: v2.26.0

Summary: Compute the coverage of a feature file among a genome.

我的 Stackoverflow 问题的这一部分具有误导性和错误性!:

我已将此 shebang 添加到我的 python 脚本的开头:

#!/bin/bash

但这并没有影响结果,

从我的脚本中删除它仍然会导致相同的错误消息 这是脚本的一部分:

for filename in os.listdir(folder):
if filename.endswith(".sorted.bam"):
    namefile = filename.replace(".sorted.bam", "_ncoverage.txt")
    folder_name = filename.replace(".sorted.bam", "")
    os.system("mkdir " + folder_name)
    os.system("coverageBed -s -d -a bam " + folder + filename + " -b " + gff_file + " > " + folder_name + "/" + namefile)

这是我运行此脚本时发生的情况:

ubuntu@fat:~/jonathan/script$ sudo python2.7 script1.py ./Folder/ ./Folder/ref.fasta genbank.gff
sh: coverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: coverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: coverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: coverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: coverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: coverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: coverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: coverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: coverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found
sh: genomeCoverageBed: command not found

你对我能做什么有什么建议,或者即使我走在正确的轨道上? 感谢您的帮助!

【问题讨论】:

  • 嗯,你把#!/bin/sh放在python脚本的顶部?它运行一个子shell,而不是python。
  • 您的脚本到底是用什么语言编写的,pythonbash??
  • 但是你为什么把#!/bin/bash作为第一行呢?如果它是一个 python 脚本,则输入类似#!/usr/bin/python.
  • sudo 可能是您的问题。当您sudo 在不同的环境中运行时,它可能无法找到您的程序。从外壳,sudo 工作吗?即ubuntu@fat:~/jonathan/scripty$ sudo genomeCoverageBed?
  • 在常规 shell 中,使用type genomeCoverageBed 查看它是什么类型的命令(别名、函数或可执行文件)。如果它是非标准位置的可执行文件,则可以只使用绝对路径,例如/home/you/bin/genomeCoverageBed.

标签: python linux bash shell ubuntu


【解决方案1】:

你用错了shebang

#!/bin/bash

当要求 linux shell 运行文本文件(例如,./myprogram.py)时,它会查看 shebang 以确定应该使用哪个程序来解释文本。在您的情况下,您要求 shell 运行 /bin/bash - 另一个 shell,它试图将 python 脚本解释为 shell 脚本。

你可以用不同的方式写shebang

#!/usr/bin/env python3

这告诉 shell 运行 /usr/bin/env,它将在 PATH 中搜索名为 pythnon3 的东西。现在,您为当前环境运行 python 设置。默认情况下,它是系统 python,但如果你在 python 虚拟环境中运行,它会运行 that python。

shebang 仅在 linuxy 系统上使用,并且仅在您使脚本可执行并直接运行时使用。如果在 Windows 上运行(在 cygwin 或其他类 unix shell 之外)或直接运行 python (python /path/to/myscript.py),则不使用它。

【讨论】:

  • 确认一下,我正在尝试在 bash 环境中执行 python 脚本,是吗?我通常按​​如下方式运行脚本:sudo python2.7 script.py
  • 您最后的评论对我来说是最重要的。您只使用 shebang 使脚本可执行并直接运行它。我通过包含我错误的快速修复“#!/bin/bash”误导了您和其他人。原来的问题仍然存在
  • @JonathanAbrahams 你能发布一个失败的python脚本的小例子吗?只需将其破解为几行来演示问题并在您的问题中发布 - 加上完整的堆栈跟踪(如果适用)。然后我们就可以解决问题了。
【解决方案2】:

正如@tdelaney 在 cmets 中提到的那样,您的 shebang 正在调用子外壳。你需要使用类似下面的东西来使用 python 作为执行文件的程序:

#! /usr/bin/env python

【讨论】:

    【解决方案3】:

    如果你输入 #!/bin/bash ,Ubuntu 将不会在 python 中运行 python 文件,它将在 bash 中打开。试试把 #!/usr/bin/python 或 #!/usr/bin/env python

    【讨论】:

      【解决方案4】:

      我关注了这个帖子:

      https://unix.stackexchange.com/questions/83191/how-to-make-sudo-preserve-path

      并添加:

      sudo env "PATH=$PATH"

      到我的命令开始,这解决了我的问题!

      感谢所有帮助过的人!

      【讨论】:

        猜你喜欢
        • 2017-01-23
        • 2014-01-25
        • 2021-01-01
        • 1970-01-01
        • 2021-05-31
        • 1970-01-01
        • 1970-01-01
        • 2021-12-02
        • 2017-03-08
        相关资源
        最近更新 更多